27 #include "CLHEP/Vector/LorentzVector.h"
40 const std::string&
n,
const IInterface*
p):
42 m_addNegativeTracksToPrimaryVertex(false),
43 m_usePtCorrectedEnergy(false),
44 m_useSingleTracksAlsoForMass(false)
49 declareInterface<IJetFitterVariablesFactory>(
this);
59 ATH_MSG_INFO(
" Initialization of JetFitterVariablesFactory successful");
60 return StatusCode::SUCCESS;
64 ATH_MSG_INFO(
" Finalization of JetFitterVariablesFactory successful");
65 return StatusCode::SUCCESS;
74 bool nastyVsRevertPosToNeg = (
basename.find(
"Flip") != std::string::npos);
75 int nVTX = 0,
ndof = 0, nTracksAtVtx = 0, nSingleTracks = 0;
76 float energyFraction = NAN,
mass = NAN, mass_uncorr = NAN, significance3d = NAN, deltaphi = NAN, deltaeta = NAN,
chi2 = 0., deltaRFlightDir = NAN;
78 std::vector<Trk::VxJetCandidate*> myVertices;
80 if (myJetFitterInfo) myVertices = myJetFitterInfo->
verticesJF();
81 if(myVertices.size() == 0){
82 ATH_MSG_DEBUG(
"#BTAG# Trk::VxJetCandidate not found for jet fitter ");
95 return StatusCode::SUCCESS;
97 if(myVertices.size() > 0) myVxJetCandidate=
dynamic_cast<Trk::VxJetCandidate*
>(myVertices[0]);
98 if (myVxJetCandidate==0) {
99 ATH_MSG_WARNING(
"#BTAG# No correct VxJetCandidate could be retrieved." );
112 return StatusCode::SUCCESS;
125 double energyFromPrimary=0.;
126 double energyFromSecondary=0.;
134 if (mySelectedTracksInJet!=0)
136 ATH_MSG_DEBUG(
" Adding the tracks from primary vertex information ");
137 const std::vector<const Trk::ITrackLink*> & myPrimaryLinks=mySelectedTracksInJet->
getPrimaryTrackLinks();
139 std::vector<const Trk::ITrackLink*>::const_iterator myPrimaryLinksBegin=myPrimaryLinks.begin();
140 std::vector<const Trk::ITrackLink*>::const_iterator myPrimaryLinksEnd=myPrimaryLinks.end();
142 for(std::vector<const Trk::ITrackLink*>::const_iterator myPrimaryLinksIter=myPrimaryLinksBegin;
143 myPrimaryLinksIter!=myPrimaryLinksEnd;
144 ++myPrimaryLinksIter)
149 energyFromPrimary+=std::sqrt(s_pion*s_pion+myParameters->
momentum().mag2());
153 ATH_MSG_WARNING(
" no perigee in track for energy computation. Skipping primary track...");
158 ATH_MSG_DEBUG(
" No information about further primary tracks available. Normal in JetFitter vs. 1");
178 const std::vector<Trk::VxTrackAtVertex*>::const_iterator TracksAtPrimaryBegin=TracksAtPrimary.begin();
179 const std::vector<Trk::VxTrackAtVertex*>::const_iterator TracksAtPrimaryEnd=TracksAtPrimary.end();
181 for (std::vector<Trk::VxTrackAtVertex*>::const_iterator TracksAtPrimaryIter=TracksAtPrimaryBegin;
182 TracksAtPrimaryIter!=TracksAtPrimaryEnd;
183 ++TracksAtPrimaryIter) {
186 if (
dynamic_cast<const Trk::Perigee*
>((*TracksAtPrimaryIter)->perigeeAtVertex())!=0)
190 std::sqrt(s_pion*s_pion+
191 (*TracksAtPrimaryIter)->perigeeAtVertex()->momentum().mag2());
195 ATH_MSG_ERROR(
" FIXME: VERTEX DOESN'T SUPPORT NEUTRAL PERIGEE, commented out in line 163");
196 ATH_MSG_ERROR(
" Track is not a normal track neither a KS. This is an ERROR (ask developer to fix it). Skipping track... ");
204 CLHEP::HepLorentzVector massVector(0,0,0,0);
208 double inverrordist(0.);
217 for (std::vector<Trk::VxVertexOnJetAxis*>::const_iterator vectorOfClustersOfTrackIter=vectorOfClustersOfTrackBegin;
218 vectorOfClustersOfTrackIter!=vectorOfClustersOfTrackEnd;
219 ++vectorOfClustersOfTrackIter) {
221 const std::vector<Trk::VxTrackAtVertex*> & tracksOfVertex=(*vectorOfClustersOfTrackIter)->getTracksAtVertex();
223 int vertexSize=tracksOfVertex.size();
224 int ntrack=(*vectorOfClustersOfTrackIter)->getNumVertex()+5;
225 if (!nastyVsRevertPosToNeg)
227 if (vertexPosition[ntrack]>0) {
230 nTracksAtVtx+=vertexSize;
238 if (vertexPosition[ntrack]<=0) {
241 nTracksAtVtx+=vertexSize;
249 for (std::vector<Trk::VxVertexOnJetAxis*>::const_iterator vectorOfClustersOfTrackIter=vectorOfClustersOfTrackBegin;
250 vectorOfClustersOfTrackIter!=vectorOfClustersOfTrackEnd;
251 ++vectorOfClustersOfTrackIter) {
253 const std::vector<Trk::VxTrackAtVertex*> & tracksOfVertex=(*vectorOfClustersOfTrackIter)->getTracksAtVertex();
254 std::vector<Trk::VxTrackAtVertex*>::const_iterator clustersOfTrackBegin=tracksOfVertex.begin();
255 std::vector<Trk::VxTrackAtVertex*>::const_iterator clustersOfTrackEnd=tracksOfVertex.end();
257 int vertexSize=tracksOfVertex.size();
259 int ntrack=(*vectorOfClustersOfTrackIter)->getNumVertex()+5;
263 if ((vertexPosition[ntrack]<0 && (!nastyVsRevertPosToNeg))||(vertexPosition[ntrack]>=0 && nastyVsRevertPosToNeg)) {
266 for (std::vector<Trk::VxTrackAtVertex*>::const_iterator clustersOfTrackIter=clustersOfTrackBegin;
267 clustersOfTrackIter!=clustersOfTrackEnd;++clustersOfTrackIter) {
270 std::hypot(s_pion, (*clustersOfTrackIter)->perigeeAtVertex()->momentum().mag());
275 if ( (nVTX>0 && vertexSize>1) || nVTX==0 ) {
276 dist+=std::abs(vertexPosition[ntrack])/vertexCovMatrix(ntrack,ntrack);
277 if (vertexCovMatrix(ntrack,ntrack)>0)
279 inverrordist+=1./vertexCovMatrix(ntrack,ntrack);
283 ATH_MSG_WARNING(
"The diagonal element of the vertex cov matrix ("<<ntrack<<
","<<ntrack<<
") is "<<vertexCovMatrix(ntrack,ntrack)<<
". It should be positive... Ignoring vertex when computing L/sigma(L)");
288 CLHEP::HepLorentzVector massThisCluster(0.,0.,0.,0.);
292 for (std::vector<Trk::VxTrackAtVertex*>::const_iterator clustersOfTrackIter=clustersOfTrackBegin;
293 clustersOfTrackIter!=clustersOfTrackEnd;
294 ++clustersOfTrackIter) {
302 if (
dynamic_cast<const Trk::Perigee*
>((*clustersOfTrackIter)->perigeeAtVertex())!=0)
304 massThisCluster+=CLHEP::HepLorentzVector(mytrack.x(), mytrack.y(), mytrack.z(), std::hypot(s_pion, mytrack.mag()));
308 ATH_MSG_ERROR(
"Neutral parameter has been taken out until Vertex has been rewritten to support neutral perigee again. ");
309 ATH_MSG_ERROR(
" Track is not a normal track neither a KS. This is an ERROR (ask developer to fix it). Skipping track... ");
314 sumPAllVertices+=sumP;
315 double ptadd=sumP.perp(flightAxis.unit());
316 double masswithneutrals=std::sqrt(massThisCluster.mag2()+ptadd*ptadd)+ptadd;
320 massVector+=massThisCluster;
324 if ( (nVTX>0 && vertexSize>1) || nVTX==0 ) {
325 massVector+=massThisCluster;
333 energyFromSecondary+=std::sqrt(masswithneutrals*masswithneutrals+sumP.mag2());
337 energyFromSecondary+=std::sqrt(massThisCluster.mag2()+sumP.mag2());
346 if (energyFromSecondary+energyFromPrimary>0) {
347 energyFraction=energyFromSecondary/(energyFromSecondary+energyFromPrimary);
350 if (massVector.mag()>0) {
351 mass=std::sqrt(massVector.mag2()+sumPtAdd*sumPtAdd)+sumPtAdd;
352 mass_uncorr=massVector.mag();
358 if (mass_uncorr>5000.) {
364 if (inverrordist!=0) {
365 significance3d=dist/std::sqrt(inverrordist);
370 if (std::abs(sumPAllVertices.mag())>1
e-7) {
371 deltaphi=sumPAllVertices.eta()-JetVector.Eta();
372 deltaeta=sumPAllVertices.deltaPhi(
Amg::Vector3D(JetVector.Px(), JetVector.Py(), JetVector.Pz()));
373 deltaRFlightDir = std::hypot(sumPAllVertices.deltaPhi(flightAxis), sumPAllVertices.eta()-flightAxis.eta());
377 deltaRFlightDir = -10;
393 return StatusCode::SUCCESS;
399 bool nastyVsRevertPosToNeg = (
basename.find(
"Flip")!=std::string::npos);
402 int nSingleTracks(0);
403 float energyFraction(0);
405 float mass_uncorr(0);
406 float significance3d(0);
411 float deltaRFlightDir(0.);
413 std::vector<Trk::VxJetCandidate*> myVertices;
415 if (myJetFitterInfo) myVertices = myJetFitterInfo->
verticesJF();
416 if(myVertices.size() == 0){
417 ATH_MSG_DEBUG(
"#BTAG# Trk::VxJetCandidate not found for jet fitter ");
418 fill(
BTag,
basename, mass_uncorr, nVTX, nSingleTracks, nTracksAtVtx,
mass, energyFraction, significance3d, deltaeta, deltaphi,
chi2,
ndof, deltaRFlightDir);
419 return StatusCode::SUCCESS;
421 if(myVertices.size() > 0) myVxJetCandidate=
dynamic_cast<Trk::VxJetCandidate*
>(myVertices[0]);
422 if (myVxJetCandidate==0) {
423 ATH_MSG_WARNING(
"#BTAG# No correct VxJetCandidate could be retrieved." );
424 fill(
BTag,
basename, mass_uncorr, nVTX, nSingleTracks, nTracksAtVtx,
mass, energyFraction, significance3d, deltaeta, deltaphi,
chi2,
ndof, deltaRFlightDir);
425 return StatusCode::SUCCESS;
438 double energyFromPrimary=0.;
439 double energyFromSecondary=0.;
447 if (mySelectedTracksInJet!=0)
449 ATH_MSG_DEBUG(
" Adding the tracks from primary vertex information ");
450 const std::vector<const Trk::ITrackLink*> & myPrimaryLinks=mySelectedTracksInJet->
getPrimaryTrackLinks();
452 std::vector<const Trk::ITrackLink*>::const_iterator myPrimaryLinksBegin=myPrimaryLinks.begin();
453 std::vector<const Trk::ITrackLink*>::const_iterator myPrimaryLinksEnd=myPrimaryLinks.end();
455 for(std::vector<const Trk::ITrackLink*>::const_iterator myPrimaryLinksIter=myPrimaryLinksBegin;
456 myPrimaryLinksIter!=myPrimaryLinksEnd;
457 ++myPrimaryLinksIter)
462 energyFromPrimary+=std::sqrt(s_pion*s_pion+myParameters->
momentum().mag2());
466 ATH_MSG_WARNING(
" no perigee in track for energy computation. Skipping primary track...");
471 ATH_MSG_DEBUG(
" No information about further primary tracks available. Normal in JetFitter vs. 1");
491 const std::vector<Trk::VxTrackAtVertex*>::const_iterator TracksAtPrimaryBegin=TracksAtPrimary.begin();
492 const std::vector<Trk::VxTrackAtVertex*>::const_iterator TracksAtPrimaryEnd=TracksAtPrimary.end();
494 for (std::vector<Trk::VxTrackAtVertex*>::const_iterator TracksAtPrimaryIter=TracksAtPrimaryBegin;
495 TracksAtPrimaryIter!=TracksAtPrimaryEnd;
496 ++TracksAtPrimaryIter) {
499 if (
dynamic_cast<const Trk::Perigee*
>((*TracksAtPrimaryIter)->perigeeAtVertex())!=0)
503 std::sqrt(s_pion*s_pion+
504 (*TracksAtPrimaryIter)->perigeeAtVertex()->momentum().mag2());
508 ATH_MSG_ERROR(
" FIXME: VERTEX DOESN'T SUPPORT NEUTRAL PERIGEE, commented out in line 163");
509 ATH_MSG_ERROR(
" Track is not a normal track neither a KS. This is an ERROR (ask developer to fix it). Skipping track... ");
517 CLHEP::HepLorentzVector massVector(0,0,0,0);
521 double inverrordist(0.);
530 for (std::vector<Trk::VxVertexOnJetAxis*>::const_iterator vectorOfClustersOfTrackIter=vectorOfClustersOfTrackBegin;
531 vectorOfClustersOfTrackIter!=vectorOfClustersOfTrackEnd;
532 ++vectorOfClustersOfTrackIter) {
534 const std::vector<Trk::VxTrackAtVertex*> & tracksOfVertex=(*vectorOfClustersOfTrackIter)->getTracksAtVertex();
536 int vertexSize=tracksOfVertex.size();
537 int ntrack=(*vectorOfClustersOfTrackIter)->getNumVertex()+5;
538 if (!nastyVsRevertPosToNeg)
540 if (vertexPosition[ntrack]>0) {
543 nTracksAtVtx+=vertexSize;
551 if (vertexPosition[ntrack]<=0) {
554 nTracksAtVtx+=vertexSize;
562 for (std::vector<Trk::VxVertexOnJetAxis*>::const_iterator vectorOfClustersOfTrackIter=vectorOfClustersOfTrackBegin;
563 vectorOfClustersOfTrackIter!=vectorOfClustersOfTrackEnd;
564 ++vectorOfClustersOfTrackIter) {
566 const std::vector<Trk::VxTrackAtVertex*> & tracksOfVertex=(*vectorOfClustersOfTrackIter)->getTracksAtVertex();
567 std::vector<Trk::VxTrackAtVertex*>::const_iterator clustersOfTrackBegin=tracksOfVertex.begin();
568 std::vector<Trk::VxTrackAtVertex*>::const_iterator clustersOfTrackEnd=tracksOfVertex.end();
570 int vertexSize=tracksOfVertex.size();
572 int ntrack=(*vectorOfClustersOfTrackIter)->getNumVertex()+5;
576 if ((vertexPosition[ntrack]<0 && (!nastyVsRevertPosToNeg))||(vertexPosition[ntrack]>=0 && nastyVsRevertPosToNeg)) {
579 for (std::vector<Trk::VxTrackAtVertex*>::const_iterator clustersOfTrackIter=clustersOfTrackBegin;
580 clustersOfTrackIter!=clustersOfTrackEnd;++clustersOfTrackIter) {
583 std::hypot(s_pion, (*clustersOfTrackIter)->perigeeAtVertex()->momentum().mag());
588 if ( (nVTX>0 && vertexSize>1) || nVTX==0 ) {
589 dist+=std::abs(vertexPosition[ntrack])/vertexCovMatrix(ntrack,ntrack);
590 if (vertexCovMatrix(ntrack,ntrack)>0)
592 inverrordist+=1./vertexCovMatrix(ntrack,ntrack);
596 ATH_MSG_WARNING(
"The diagonal element of the vertex cov matrix ("<<ntrack<<
","<<ntrack<<
") is "<<vertexCovMatrix(ntrack,ntrack)<<
". It should be positive... Ignoring vertex when computing L/sigma(L)");
601 CLHEP::HepLorentzVector massThisCluster(0.,0.,0.,0.);
605 for (std::vector<Trk::VxTrackAtVertex*>::const_iterator clustersOfTrackIter=clustersOfTrackBegin;
606 clustersOfTrackIter!=clustersOfTrackEnd;
607 ++clustersOfTrackIter) {
615 if (
dynamic_cast<const Trk::Perigee*
>((*clustersOfTrackIter)->perigeeAtVertex())!=0)
617 massThisCluster+=CLHEP::HepLorentzVector(mytrack.x(), mytrack.y(), mytrack.z(), std::hypot(s_pion, mytrack.mag()));
621 ATH_MSG_ERROR(
"Neutral parameter has been taken out until Vertex has been rewritten to support neutral perigee again. ");
622 ATH_MSG_ERROR(
" Track is not a normal track neither a KS. This is an ERROR (ask developer to fix it). Skipping track... ");
627 sumPAllVertices+=sumP;
628 double ptadd=sumP.perp(flightAxis.unit());
629 double masswithneutrals=std::sqrt(massThisCluster.mag2()+ptadd*ptadd)+ptadd;
633 massVector+=massThisCluster;
637 if ( (nVTX>0 && vertexSize>1) || nVTX==0 ) {
638 massVector+=massThisCluster;
646 energyFromSecondary+=std::sqrt(masswithneutrals*masswithneutrals+sumP.mag2());
650 energyFromSecondary+=std::sqrt(massThisCluster.mag2()+sumP.mag2());
659 if (energyFromSecondary+energyFromPrimary>0) {
660 energyFraction=energyFromSecondary/(energyFromSecondary+energyFromPrimary);
663 if (massVector.mag()>0) {
664 mass=std::sqrt(massVector.mag2()+sumPtAdd*sumPtAdd)+sumPtAdd;
665 mass_uncorr=massVector.mag();
671 if (mass_uncorr>5000.) {
677 if (inverrordist!=0) {
678 significance3d=dist/std::sqrt(inverrordist);
683 if (std::abs(sumPAllVertices.mag())>1
e-7) {
684 deltaphi=sumPAllVertices.eta()-JetVector.Eta();
685 deltaeta=sumPAllVertices.deltaPhi(
Amg::Vector3D(JetVector.Px(), JetVector.Py(), JetVector.Pz()));
686 deltaRFlightDir = std::hypot(sumPAllVertices.deltaPhi(flightAxis), sumPAllVertices.eta()-flightAxis.eta());
690 deltaRFlightDir = -10;
694 fill(
BTag,
basename, mass_uncorr, nVTX, nSingleTracks, nTracksAtVtx,
mass, energyFraction, significance3d, deltaeta, deltaphi,
chi2,
ndof, deltaRFlightDir);
696 return StatusCode::SUCCESS;
703 int nVTX,
int nSingleTracks,
int nTracksAtVtx,
float mass,
float energyFraction,
704 float significance3d,
float deltaeta,
float deltaphi,
float chi2,
int ndof,
float deltaRFlightDir)
const {
706 BTag->setVariable<
float>(
basename,
"massUncorr", mass_uncorr);
709 BTag->setVariable<
float>(
basename,
"dRFlightDir", deltaRFlightDir);
722 BTag->setVariable<
int>(
basename,
"nSingleTracks", nSingleTracks);
723 BTag->setVariable<
int>(
basename,
"nTracksAtVtx", nTracksAtVtx);
725 BTag->setVariable<
float>(
basename,
"energyFraction", energyFraction);
726 BTag->setVariable<
float>(
basename,
"significance3d", significance3d);
727 BTag->setVariable<
float>(
basename,
"deltaeta", deltaeta);
728 BTag->setVariable<
float>(
basename,
"deltaphi", deltaphi);