39 int numRow(
int numVertex) {
45 bool signFlipTreatment) {
47 int numbRow=numRow(numVertex);
57 dist=myPosition[numbRow];
58 if (fabs(dist)*sc_theta.sn>300.) {
59 dist=dist/fabs(dist)*300./sc_theta.sn;
62 if (signFlipTreatment) {
70 yv+dist*sc_phi.sn*sc_theta.sn,
78 m_linearizedFactory(
"Trk::FullLinearizedTrackFactory", this),
79 m_errphiJetAxis(0.07),
80 m_erretaJetAxis(0.065)
85 declareInterface< JetFitterInitializationHelper >(
this) ;
101 return StatusCode::FAILURE;
105 return StatusCode::SUCCESS;
127 std::vector<Trk::VxTrackAtVertex*>* setOfTracks=myJetCandidate->
vxTrackAtVertex();
129 std::vector<const Trk::ITrackLink*>::const_iterator vectorOfLinkBegin=vectorOfLink.begin();
130 std::vector<const Trk::ITrackLink*>::const_iterator vectorOfLinkEnd=vectorOfLink.end();
132 for (std::vector<const Trk::ITrackLink*>::const_iterator vectorOfLinkIter=vectorOfLinkBegin;
133 vectorOfLinkIter!=vectorOfLinkEnd;++vectorOfLinkIter)
135 std::vector<Trk::VxTrackAtVertex*> temp_vector_tracksAtVertex;
137 temp_vector_tracksAtVertex.push_back(newVxTrack);
138 setOfTracks->push_back(newVxTrack);
150 const RecVertex* primaryVertex,
158 VxJetCandidate* myJetCandidate=
new VxJetCandidate(vectorOfTP);
188 if (primaryVertex==
nullptr) {
189 std::cout <<
"ERROR. No valid primary vertex pointer provided to the JetFitterInitializationHelper." << std::endl;
190 throw std::runtime_error (
"No valid primary vertex pointer provided to the JetFitterInitializationHelper.");
197 if (jetdirection!=
nullptr) {
201 std::cout <<
"JetFitterInitializationHelper: Error! no starting jet direction provided. Using (0,0)" << std::endl;
222 AmgSymMatrix(3) primaryCovariance(primaryVertex->covariancePosition().block<3,3>(0,0));
223 AmgSymMatrix(5) startCovariance; startCovariance.setZero();
224 startCovariance.block<3,3>(0,0) = primaryCovariance;
229 RecVertexPositions startRecVertexPositions(startPosition,
234 myJetCandidate->setRecVertexPositions(startRecVertexPositions);
235 myJetCandidate->setConstraintVertexPositions(startRecVertexPositions);
237 VertexPositions linVertexPositions;
238 if (linearizationjetdirection!=
nullptr) {
241 linPosition[
Trk::jet_phi]=linearizationjetdirection->phi();
242 linVertexPositions=VertexPositions(linPosition);
244 linVertexPositions=startRecVertexPositions;
253 const VxVertexOnJetAxis* primaryVertexJC(myJetCandidate->
getPrimaryVertex());
255 if (primaryVertexJC==
nullptr) {
258 VxVertexOnJetAxis newPrimaryVertex;
260 newPrimaryVertex.setNumVertex(-10);
269 return myJetCandidate;
275 const std::vector<VxVertexOnJetAxis*> & associatedVertices=myJetCandidate->getVerticesOnJetAxis();
277 const std::vector<VxVertexOnJetAxis*>::const_iterator VtxBegin=associatedVertices.begin();
278 const std::vector<VxVertexOnJetAxis*>::const_iterator VtxEnd=associatedVertices.end();
283 if (!associatedVertices.empty()) {
284 for (std::vector<VxVertexOnJetAxis*>::const_iterator VtxIter=VtxBegin;VtxIter!=VtxEnd;++VtxIter) {
285 VxVertexOnJetAxis* myVertex=(*VtxIter);
286 if (myVertex!=
nullptr) {
287 myVertex->setNumVertex(numTrack);
290 std::cout <<
"Warning in JetFitterInitializationHelper.Inconsistency found. Pointer to VxVertexOnJetAxis should be different from zero. Skipping track..." << std::endl;
291 throw std::runtime_error (
"Warning in JetFitterInitializationHelper.Inconsistency found. Pointer to VxVertexOnJetAxis should be different from zero. Skipping track...");
295 int sizeOfRecVertex=myJetCandidate->getRecVertexPositions().position().rows();
298 if (numRow(numTrack)>sizeOfRecVertex) {
301 myJetCandidate->setRecVertexPositions(myJetCandidate->getConstraintVertexPositions());
303 Amg::VectorX myPosition = myJetCandidate->getRecVertexPositions().position();
304 Amg::MatrixX myCovariance = myJetCandidate->getRecVertexPositions().covariancePosition();
305 Amg::VectorX newPosition(numRow(numTrack)); newPosition.setZero();
306 newPosition.segment(0,myPosition.rows()) = myPosition;
307 Amg::MatrixX newCovariance(numRow(numTrack),numRow(numTrack));
308 newCovariance.setZero();
309 newCovariance.block(0,0,myCovariance.rows(),myCovariance.cols()) = myCovariance;
310 for (
int i=sizeOfRecVertex;
i<numRow(numTrack);++
i) {
311 newCovariance(
i,
i)=500.*500.;
314 RecVertexPositions newRecVertexPositions(newPosition,
316 myJetCandidate->getRecVertexPositions().fitQuality().chiSquared(),
317 myJetCandidate->getRecVertexPositions().fitQuality().numberDoF());
320 Amg::VectorX myPositionLinearization = myJetCandidate->getLinearizationVertexPositions().position();
321 Amg::VectorX newPositionLinearization(numRow(numTrack));
322 newPositionLinearization.setZero();
323 newPositionLinearization.segment(0,myPositionLinearization.rows()) = myPositionLinearization;
325 myJetCandidate->setRecVertexPositions(newRecVertexPositions);
326 myJetCandidate->setConstraintVertexPositions(newRecVertexPositions);
327 myJetCandidate->setLinearizationVertexPositions(newPositionLinearization);
329 }
else if (numRow(numTrack)<sizeOfRecVertex) {
330 std::cout <<
"Strange: size of RecVertexPosition's position in JetFitterInitializationHelper is bigger than actual numTracks plus 5. CHECK..." << std::endl;
331 throw std::runtime_error (
"Strange: size of RecVertexPosition's position in JetFitterInitializationHelper is bigger than actual numTracks plus 5. CHECK...");
339 bool signFlipTreatment,
340 double maxdistance)
const {
342 const VertexPositions & myLinVertexPosition=myJetCandidate->getLinearizationVertexPositions();
343 const Amg::VectorX & myPosition=myLinVertexPosition.position();
345 const VxVertexOnJetAxis* myPrimary=myJetCandidate->getPrimaryVertex();
346 const std::vector<VxTrackAtVertex*> & primaryVectorTracks=myPrimary->getTracksAtVertex();
351 const std::vector<VxTrackAtVertex*>::const_iterator primaryVectorTracksBegin=primaryVectorTracks.begin();
352 const std::vector<VxTrackAtVertex*>::const_iterator primaryVectorTracksEnd=primaryVectorTracks.end();
354 for (std::vector<VxTrackAtVertex*>::const_iterator primaryVectorIter=primaryVectorTracksBegin;
355 primaryVectorIter!=primaryVectorTracksEnd;++primaryVectorIter) {
361 if (linTrack!=
nullptr) {
375 const std::vector<VxVertexOnJetAxis*> & associatedVertices=myJetCandidate->getVerticesOnJetAxis();
377 const std::vector<VxVertexOnJetAxis*>::const_iterator VtxBegin=associatedVertices.begin();
378 const std::vector<VxVertexOnJetAxis*>::const_iterator VtxEnd=associatedVertices.end();
380 for (std::vector<VxVertexOnJetAxis*>::const_iterator VtxIter=VtxBegin;VtxIter!=VtxEnd;++VtxIter) {
382 int numVertex=(*VtxIter)->getNumVertex();
383 Amg::Vector3D secondaryVertexPos(getSingleVtxPositionWithSignFlip(myPosition,numVertex,signFlipTreatment));
387 const std::vector<VxTrackAtVertex*> & tracksAtVertex=(*VtxIter)->getTracksAtVertex();
389 const std::vector<VxTrackAtVertex*>::const_iterator TracksBegin=tracksAtVertex.begin();
390 const std::vector<VxTrackAtVertex*>::const_iterator TracksEnd=tracksAtVertex.end();
392 for (std::vector<VxTrackAtVertex*>::const_iterator TrackVectorIter=TracksBegin;
393 TrackVectorIter!=TracksEnd;++TrackVectorIter) {
397 if (linTrack!=
nullptr) {