86 const TLorentzVector & jetMomentum,
87 const std::vector<const Trk::TrackParticleBase*> & myTracks)
const {
88 Amg::Vector3D myDirection(jetMomentum.Vect().X(),jetMomentum.Vect().Y(),jetMomentum.Vect().Z());
90 std::vector<TrackParticle_pair> tracks;
92 std::vector<const Trk::TrackParticleBase*>::const_iterator tracksBegin=myTracks.begin();
93 std::vector<const Trk::TrackParticleBase*>::const_iterator tracksEnd=myTracks.end();
94 for (std::vector<const Trk::TrackParticleBase*>::const_iterator tracksIter=tracksBegin;
95 tracksIter!=tracksEnd;++tracksIter) {
96 if (
m_trkFilter->decision(**tracksIter,&primaryVertex)) {
97 tracks.emplace_back((*tracksIter)->perigee()->momentum().perp(),*tracksIter);
101 std::vector<std::vector<const Trk::TrackParticleBase*> > bunchesOfTracks;
105 std::vector<const Trk::TrackParticleBase*> tracksToAdd;
107 std::vector<TrackParticle_pair>::const_iterator tracks2Begin=tracks.begin();
108 std::vector<TrackParticle_pair>::const_iterator tracks2End=tracks.end();
109 for (std::vector<TrackParticle_pair>::const_iterator tracks2Iter=tracks2Begin;
110 tracks2Iter!=tracks2End;++tracks2Iter) {
111 if (
msgLvl(MSG::VERBOSE))
msg() <<
" track: " << (*tracks2Iter).first <<
" and : " << (*tracks2Iter).second <<
endmsg;
113 tracksToAdd.push_back((*tracks2Iter).second);
116 bunchesOfTracks.push_back(tracksToAdd);
121 bunchesOfTracks.push_back(std::move(tracksToAdd));
123 std::vector<std::vector<const Trk::TrackParticleBase*> >
::const_iterator BunchesBegin=bunchesOfTracks.begin();
124 std::vector<std::vector<const Trk::TrackParticleBase*> >
::const_iterator BunchesEnd=bunchesOfTracks.end();
126 std::vector<const Trk::TrackParticleBase*>::const_iterator tracksToAddBegin;
127 std::vector<const Trk::TrackParticleBase*>::const_iterator tracksToAddEnd;
128 std::vector<const Trk::TrackParticleBase*>::const_iterator tracksToAddIter;
131 std::unique_ptr<Trk::VxJetCandidate> myJetCandidate;
133 for (std::vector<std::vector<const Trk::TrackParticleBase*> >
::const_iterator BunchesIter=BunchesBegin;
134 BunchesIter!=BunchesEnd;++BunchesIter) {
136 if (BunchesIter==BunchesBegin) {
137 if (
msgLvl(MSG::VERBOSE))
msg() <<
" initial fit with " << (*BunchesIter).size() <<
" tracks " <<
endmsg;
138 myJetCandidate.reset(
m_initializationHelper->initializeJetCandidate(*BunchesIter,&primaryVertex,&myDirection));
139 m_routines->initializeToMinDistancesToJetAxis(myJetCandidate.get());
141 }
else if (myJetCandidate){
142 if (
msgLvl(MSG::VERBOSE))
msg() <<
" other fit with " << (*BunchesIter).size() <<
" tracks " <<
endmsg;
143 std::vector<Trk::VxVertexOnJetAxis*> setOfVertices=myJetCandidate->getVerticesOnJetAxis();
144 std::vector<Trk::VxTrackAtVertex*>* setOfTracks=myJetCandidate->vxTrackAtVertex();
145 tracksToAddBegin=(*BunchesIter).begin();
146 tracksToAddEnd=(*BunchesIter).end();
147 for (tracksToAddIter=tracksToAddBegin;tracksToAddIter!=tracksToAddEnd;++tracksToAddIter) {
148 std::vector<Trk::VxTrackAtVertex*> temp_vector_tracksAtVertex;
150 link.setElement(*tracksToAddIter);
153 temp_vector_tracksAtVertex.push_back(newVxTrack);
154 setOfTracks->push_back(std::move(newVxTrack));
157 if (
msgLvl(MSG::VERBOSE))
msg() <<
" new overall number of tracks to fit : " << setOfVertices.size() <<
endmsg;
158 myJetCandidate->setVerticesOnJetAxis(setOfVertices);
164 std::vector<Trk::VxCandidate*> myCandidates;
165 myCandidates.push_back(myJetCandidate.get());
172 const TLorentzVector & jetMomentum,
173 const std::vector<const Trk::TrackParticleBase*> & firstInputTracks,
174 const std::vector<const Trk::TrackParticleBase*> & secondInputTracks,
178 Amg::Vector3D myDirection(jetMomentum.Vect().X(),jetMomentum.Vect().Y(),jetMomentum.Vect().Z());
180 std::vector<std::vector<const Trk::TrackParticleBase*> > bunchesOfTracks;
182 std::vector<const Trk::TrackParticleBase*> tracksToAdd;
184 std::vector<const Trk::TrackParticleBase*>::const_iterator tracks2Begin=firstInputTracks.begin();
185 std::vector<const Trk::TrackParticleBase*>::const_iterator tracks2End=firstInputTracks.end();
186 for (std::vector<const Trk::TrackParticleBase*>::const_iterator tracks2Iter=tracks2Begin;
187 tracks2Iter!=tracks2End;++tracks2Iter) {
189 tracksToAdd.push_back(*tracks2Iter);
192 bunchesOfTracks.push_back(tracksToAdd);
195 std::vector<const Trk::TrackParticleBase*>::const_iterator tracks3Begin=secondInputTracks.begin();
196 std::vector<const Trk::TrackParticleBase*>::const_iterator tracks3End=secondInputTracks.end();
197 for (std::vector<const Trk::TrackParticleBase*>::const_iterator tracks3Iter=tracks3Begin;
198 tracks3Iter!=tracks3End;++tracks3Iter) {
200 tracksToAdd.push_back(*tracks3Iter);
203 if (!tracksToAdd.empty())
205 bunchesOfTracks.push_back(tracksToAdd);
215 std::vector<std::vector<const Trk::TrackParticleBase*> >
::const_iterator BunchesBegin=bunchesOfTracks.begin();
216 std::vector<std::vector<const Trk::TrackParticleBase*> >
::const_iterator BunchesEnd=bunchesOfTracks.end();
218 std::vector<const Trk::TrackParticleBase*>::const_iterator tracksToAddBegin;
219 std::vector<const Trk::TrackParticleBase*>::const_iterator tracksToAddEnd;
220 std::vector<const Trk::TrackParticleBase*>::const_iterator tracksToAddIter;
223 std::unique_ptr<Trk::VxJetCandidate> myJetCandidate;
225 for (std::vector<std::vector<const Trk::TrackParticleBase*> >
::const_iterator BunchesIter=BunchesBegin;
226 BunchesIter!=BunchesEnd;++BunchesIter) {
228 if (BunchesIter==BunchesBegin) {
229 if (
msgLvl(MSG::VERBOSE))
msg() <<
" initial fit with " << (*BunchesIter).size() <<
" tracks " <<
endmsg;
230 myJetCandidate.reset(
m_initializationHelper->initializeJetCandidate(*BunchesIter,&primaryVertex,&myDirection,&vtxSeedDirection));
231 m_routines->initializeToMinDistancesToJetAxis(myJetCandidate.get());
232 if (!(*BunchesIter).empty())
234 doTheFit(myJetCandidate.get(),
true);
236 }
else if (myJetCandidate){
237 if (
msgLvl(MSG::VERBOSE))
msg() <<
" other fit with " << (*BunchesIter).size() <<
" tracks " <<
endmsg;
238 std::vector<Trk::VxVertexOnJetAxis*> setOfVertices=myJetCandidate->getVerticesOnJetAxis();
239 std::vector<Trk::VxTrackAtVertex*>* setOfTracks=myJetCandidate->vxTrackAtVertex();
240 tracksToAddBegin=(*BunchesIter).begin();
241 tracksToAddEnd=(*BunchesIter).end();
242 for (tracksToAddIter=tracksToAddBegin;tracksToAddIter!=tracksToAddEnd;++tracksToAddIter) {
243 std::vector<Trk::VxTrackAtVertex*> temp_vector_tracksAtVertex;
245 link.setElement(*tracksToAddIter);
248 temp_vector_tracksAtVertex.push_back(newVxTrack);
249 setOfTracks->push_back(newVxTrack);
252 if (
msgLvl(MSG::VERBOSE))
msg() <<
" new overall number of tracks to fit : " << setOfVertices.size() <<
endmsg;
253 myJetCandidate->setVerticesOnJetAxis(setOfVertices);
255 m_routines->initializeToMinDistancesToJetAxis(myJetCandidate.get());
260 std::vector<Trk::VxCandidate*> myCandidates;
261 myCandidates.push_back(myJetCandidate.release());
268 bool performClustering)
const {
271 int numClusteringLoops=0;
272 bool noMoreVerticesToCluster(
false);
276 if (
msgLvl(MSG::VERBOSE))
msg() <<
"InDetJetFitterVxFinder: ------>>>> new cycle of fit" <<
endmsg;
279 bool noMoreTracksToDelete(
false);
282 m_routines->performTheFit(myJetCandidate,10,
false,30,0.001);
286 std::vector<Trk::VxVertexOnJetAxis*>::const_iterator verticesBegin=vertices.begin();
287 std::vector<Trk::VxVertexOnJetAxis*>::const_iterator verticesEnd=vertices.end();
293 for (std::vector<Trk::VxVertexOnJetAxis*>::const_iterator verticesIter=verticesBegin;
294 verticesIter!=verticesEnd;++verticesIter) {
295 if (*verticesIter==
nullptr) {
296 if (
msgLvl(MSG::WARNING))
msg() <<
"One vertex is empy. Problem when trying to delete incompatible vertices. No further vertices deleted." <<
endmsg;
299 if (TMath::Prob(fitQuality.
chiSquared(),(
int)std::floor(fitQuality.
numberDoF()+0.5))<max_prob) {
301 worseVertex=*verticesIter;
308 if (
msgLvl(MSG::INFO))
msg() <<
" The most incompatible vertex is the primary vertex. Please check..." <<
endmsg;
311 m_routines->deleteVertexFromJetCandidate(worseVertex,myJetCandidate);
314 noMoreTracksToDelete=
true;
315 if (
msgLvl(MSG::VERBOSE))
msg() <<
"No tracks to delete: maximum probability is " << max_prob <<
endmsg;
321 if (!performClustering)
break;
324 m_routines->fillTableWithFullProbOfMerging(myJetCandidate,5,
false,10,0.01);
326 m_routines->fillTableWithFastProbOfMerging(myJetCandidate);
333 if (clusteringTablePtr==
nullptr) {
334 if (
msgLvl(MSG::WARNING))
msg() <<
" No Clustering Table while it should have been calculated... no more clustering performed during vertexing " <<
endmsg;
335 noMoreVerticesToCluster=
true;
338 if (
msgLvl(MSG::VERBOSE))
msg() <<
" clustering table is " << *clusteringTablePtr <<
endmsg;
341 float probVertex(0.);
346 if (
msgLvl(MSG::VERBOSE))
msg() <<
" merging vtx number " << (*pairOfVxVertexOnJetAxis.first).getNumVertex() <<
347 " and " << (*pairOfVxVertexOnJetAxis.second).getNumVertex() <<
endmsg;
349 m_helper->mergeVerticesInJetCandidate(*pairOfVxVertexOnJetAxis.first,
350 *pairOfVxVertexOnJetAxis.second,
356 noMoreVerticesToCluster=
true;
359 numClusteringLoops+=1;
bool operator<(const TrackParticle_pair &other) const
const Trk::TrackParticleBase * second
TrackParticle_pair(double p1, const Trk::TrackParticleBase *p2)