25 return StatusCode::FAILURE;
31 return StatusCode::FAILURE;
37 return StatusCode::FAILURE;
43 return StatusCode::FAILURE;
51 return StatusCode::FAILURE;
54 return StatusCode::SUCCESS;
62 m_ignoreBeamSpot(false),
63 m_extrapolator(
"Trk::Extrapolator"),
64 m_vtxSeedFinder(
"Trk::CrossDistancesSeedFinder")
66 declareInterface<IMultiPVSeedFinder>(
this);
93 const EventContext& ctx = Gaudi::Hive::currentContext();
96 std::vector<const Trk::Track*> preselectedTracks(0);
97 std::vector<const Trk::Track*>::const_iterator tr = tracks.begin();
98 std::vector<const Trk::Track*>::const_iterator tre = tracks.end();
102 for(;tr!=tre;++tr)
if(
m_trkFilter->decision(**tr,&beamrecposition)) preselectedTracks.push_back(*tr);
111 " vtx seed y: " << myVertex.
position().y() <<
112 " vtx seed z: " << myVertex.
position().z());
113 beamposition = &myVertex;
118 std::vector< std::vector<const Trk::Track *> >
result(0);
119 if(!preselectedTracks.empty())
121 std::vector<int> indexOfSorted =
m_sortingTool->sortedIndex(preselectedTracks, beamposition);
124 std::vector< std::vector<const Trk::Track *> > preClusters(0);
127 std::vector<const Trk::Track *> tmp_cluster(0);
136 double lastTrackZ0 = -999.;
137 if(exPerigee) { lastTrackZ0 = exPerigee->parameters()[
Trk::z0];
delete exPerigee; }
140 ATH_MSG_WARNING(
"Impossible to extrapolate the first track; returning 0 container for this event");
145 for(
int i : indexOfSorted)
152 double currentTrackZ0 = lexPerigee->parameters()[
Trk::z0];
155 if (std::fabs(currentTrackZ0 - lastTrackZ0) <
m_sepDistance) {
157 tmp_cluster.push_back(preselectedTracks[
i]);
160 preClusters.push_back(tmp_cluster);
162 tmp_cluster.push_back(preselectedTracks[
i]);
164 lastTrackZ0 = currentTrackZ0;
168 preClusters.push_back(tmp_cluster);
171 for(
const auto & preCluster : preClusters)
186 std::vector<const Trk::Track *> tracks_to_clean = preCluster;
187 bool clean_again =
false;
189 std::pair<std::vector<const Trk::Track *>, std::vector<const Trk::Track *> > clusterAndOutl =
190 m_cleaningTool->clusterAndOutliers(tracks_to_clean, beamposition);
193 std::vector<const Trk::Track *> core_cluster = clusterAndOutl.first;
194 std::vector<const Trk::Track *> core_outl = clusterAndOutl.second;
203 if(core_cluster.empty()){
204 ATH_MSG_DEBUG(
"Core cluster has 0 size, remaining tracks are discarded.");
208 if(core_cluster.size()>1)
result.push_back(core_cluster);
213 tracks_to_clean.clear();
214 tracks_to_clean = core_outl;
215 }
else if(core_outl.size()>1){
217 ATH_MSG_DEBUG(
"There were remaining outliers of size: "<< core_outl.size());
218 ATH_MSG_DEBUG(
"Not evident, whether these tracks form a cluster. Rejected...");
219 }
else clean_again =
false;
224 }
else if(preCluster.size()==2){
226 result.push_back(preCluster);
236 const EventContext& ctx = Gaudi::Hive::currentContext();
239 std::vector<const xAOD::TrackParticle*> preselectedTracks(0);
244 beamposition.
setPosition(beamSpotHandle->beamVtx().position());
247 for (
const auto *
track : tracks) {
251 std::vector<const Trk::TrackParameters*> perigeeList;
252 std::vector<const xAOD::TrackParticle*>::const_iterator trackBegin=tracks.begin();
253 std::vector<const xAOD::TrackParticle*>::const_iterator trackEnd=tracks.end();
254 for (std::vector<const xAOD::TrackParticle*>::const_iterator trackIter=trackBegin;trackIter!=trackEnd;++trackIter){
255 perigeeList.push_back(&((*trackIter)->perigeeParameters()));
262 " vtx seed y: " << myVertex.
position().y() <<
263 " vtx seed z: " << myVertex.
position().z());
270 std::vector< std::vector<const Trk::TrackParameters *> >
result(0);
271 if(!preselectedTracks.empty()){
272 std::vector<int> indexOfSorted =
m_sortingTool->sortedIndex(preselectedTracks, &beamposition);
277 std::vector< std::vector<const xAOD::TrackParticle *> > preClusters(0);
280 std::vector<const xAOD::TrackParticle *> tmp_cluster(0);
289 double lastTrackZ0 = -999.;
291 lastTrackZ0 = exPerigee->parameters()[
Trk::z0];
delete exPerigee;
294 ATH_MSG_WARNING(
"Impossible to extrapolate the first track; returning 0 container for this event");
299 for(
int i : indexOfSorted){
304 double currentTrackZ0 = lexPerigee->parameters()[
Trk::z0];
307 if (std::fabs(currentTrackZ0 - lastTrackZ0) <
m_sepDistance) {
309 tmp_cluster.push_back(preselectedTracks[
i]);
312 preClusters.push_back(tmp_cluster);
314 tmp_cluster.push_back(preselectedTracks[
i]);
317 lastTrackZ0 = currentTrackZ0;
321 preClusters.push_back(tmp_cluster);
322 ATH_MSG_DEBUG(
"The preselection returns clusters: "<<preClusters.size());
325 for(
const auto & preCluster : preClusters){
340 std::vector<const xAOD::TrackParticle *> tracks_to_clean = preCluster;
341 bool clean_again =
false;
343 std::pair<std::vector<const Trk::TrackParameters *>,
344 std::vector<const xAOD::TrackParticle *> > clusterAndOutl =
m_cleaningTool->clusterAndOutliers(tracks_to_clean, &beamposition);
347 std::vector<const Trk::TrackParameters *> core_cluster = clusterAndOutl.first;
348 std::vector<const xAOD::TrackParticle *> core_outl = clusterAndOutl.second;
357 if(core_cluster.empty()){
358 ATH_MSG_DEBUG(
"Core cluster has 0 size, remaining tracks are discarded.");
362 if(core_cluster.size()>1)
result.push_back(core_cluster);
367 tracks_to_clean.clear();
368 tracks_to_clean = core_outl;
369 }
else if(core_outl.size()>1){
371 ATH_MSG_DEBUG(
"There were remaining outliers of size: "<< core_outl.size());
372 ATH_MSG_DEBUG(
"Not evident, whether these tracks form a cluster. Rejected...");
373 }
else clean_again =
false;
378 }
else if(preCluster.size()==2){
380 std::vector<const Trk::TrackParameters *> twotrack;
383 result.push_back(twotrack);