23 return StatusCode::FAILURE;
29 return StatusCode::FAILURE;
36 return StatusCode::FAILURE;
42 return StatusCode::FAILURE;
45 return StatusCode::SUCCESS;
55 m_ignoreBeamSpot(false),
56 m_vtxSeedFinder(
"Trk::CrossDistancesSeedFinder"),
57 m_extrapolator(
"Trk::Extrapolator")
59 declareInterface<IMultiPVSeedFinder>(
this);
85 const EventContext& ctx = Gaudi::Hive::currentContext();
88 std::vector<const Trk::Track*> preselectedTracks(0);
89 std::vector<const Trk::Track*>::const_iterator tr = tracks.begin();
90 std::vector<const Trk::Track*>::const_iterator tre = tracks.end();
97 for(;tr!=tre;++tr)
if(
m_trkFilter->decision(**tr,&beamrecposition)) preselectedTracks.push_back(*tr);
105 " vtx seed y: " << myVertex.
position().y() <<
106 " vtx seed z: " << myVertex.
position().z());
107 beamposition = &myVertex;
112 std::vector< std::vector<const Trk::Track *> >
result(0);
113 if(!preselectedTracks.empty())
115 std::map<unsigned int, std::vector<const Trk::Track *> >
histo;
120 std::vector<const Trk::Track*>::const_iterator p_tr = preselectedTracks.begin();
121 std::vector<const Trk::Track*>::const_iterator p_tre = preselectedTracks.end();
127 for(;p_tr != p_tre; ++p_tr)
132 double currentTrackZ0 = lexPerigee->parameters()[
Trk::z0];
135 unsigned int bin_number =
140 std::map<unsigned int, std::vector<const Trk::Track*>>
::iterator map_pos =
141 histo.find(bin_number);
142 if (map_pos !=
histo.end()) {
144 map_pos->second.push_back(*p_tr);
147 std::vector<const Trk::Track *> tmp_vec(0);
148 tmp_vec.push_back(*p_tr);
149 histo.insert( std::map<
unsigned int, std::vector<const Trk::Track *> >::
value_type(bin_number, tmp_vec));
168 std::vector<std::vector<const Trk::Track *> > preClusters(0);
169 std::vector<const Trk::Track *> tmp_cluster(0);
170 unsigned int previous_bin =
histo.begin()->first;
172 unsigned int current_bin =
i.first;
175 preClusters.push_back(tmp_cluster);
180 for(
const auto *j :
i.second) tmp_cluster.push_back(j);
181 previous_bin = current_bin;
183 preClusters.push_back(tmp_cluster);
186 for(
const auto & preCluster : preClusters){
188 std::vector<const Trk::Track *> tracks_to_clean = preCluster;
189 bool clean_again =
false;
191 std::pair<std::vector<const Trk::Track *>, std::vector<const Trk::Track *> > clusterAndOutl =
192 m_cleaningTool->clusterAndOutliers(tracks_to_clean, beamposition);
195 std::vector<const Trk::Track *> core_cluster = clusterAndOutl.first;
196 std::vector<const Trk::Track *> core_outl = clusterAndOutl.second;
205 if(core_cluster.empty()){
206 ATH_MSG_DEBUG(
"Core cluster has 0 size, remaining tracks are discarded.");
210 if(core_cluster.size()>1)
result.push_back(core_cluster);
214 tracks_to_clean.clear();
215 tracks_to_clean = core_outl;
216 }
else if(core_outl.size()>1){
218 ATH_MSG_DEBUG(
"There were remaining outliers of size: "<< core_outl.size());
219 ATH_MSG_DEBUG(
"Not evident, whether these tracks form a cluster. Rejected...");
220 }
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::map<unsigned int, std::vector<const xAOD::TrackParticle *> >
histo;
282 std::vector<const xAOD::TrackParticle*>::const_iterator p_tr = preselectedTracks.begin();
283 std::vector<const xAOD::TrackParticle*>::const_iterator p_tre = preselectedTracks.end();
284 for(;p_tr != p_tre; ++p_tr){
289 double currentTrackZ0 = lexPerigee->parameters()[
Trk::z0];
292 unsigned int bin_number =
297 std::map<
unsigned int,
298 std::vector<const xAOD::TrackParticle*>>
::iterator map_pos =
299 histo.find(bin_number);
300 if (map_pos !=
histo.end()) {
302 map_pos->second.push_back(*p_tr);
305 std::vector<const xAOD::TrackParticle *> tmp_vec(0);
306 tmp_vec.push_back(*p_tr);
307 histo.insert( std::map<
unsigned int, std::vector<const xAOD::TrackParticle *> >::
value_type(bin_number, tmp_vec));
315 std::vector<std::vector<const xAOD::TrackParticle *> > preClusters(0);
316 std::vector<const xAOD::TrackParticle *> tmp_cluster(0);
317 unsigned int previous_bin =
histo.begin()->first;
319 unsigned int current_bin =
i.first;
322 preClusters.push_back(tmp_cluster);
326 for(
const auto *j :
i.second) tmp_cluster.push_back(j);
327 previous_bin = current_bin;
329 preClusters.push_back(tmp_cluster);
331 for(
const auto & preCluster : preClusters){
346 std::vector<const xAOD::TrackParticle *> tracks_to_clean = preCluster;
347 bool clean_again =
false;
349 std::pair<std::vector<const Trk::TrackParameters *>,
350 std::vector<const xAOD::TrackParticle *> > clusterAndOutl =
m_cleaningTool->clusterAndOutliers(tracks_to_clean, &beamposition);
353 std::vector<const Trk::TrackParameters *> core_cluster = clusterAndOutl.first;
354 std::vector<const xAOD::TrackParticle *> core_outl = clusterAndOutl.second;
363 if(core_cluster.empty()){
364 ATH_MSG_DEBUG(
"Core cluster has 0 size, remaining tracks are discarded.");
368 if(core_cluster.size()>1)
result.push_back(core_cluster);
373 tracks_to_clean.clear();
374 tracks_to_clean = core_outl;
375 }
else if(core_outl.size()>1){
377 ATH_MSG_DEBUG(
"There were remaining outliers of size: "<< core_outl.size());
378 ATH_MSG_DEBUG(
"Not evident, whether these tracks form a cluster. Rejected...");
379 }
else clean_again =
false;
384 }
else if(preCluster.size()==2){
386 std::vector<const Trk::TrackParameters *> twotrack;
389 result.push_back(twotrack);