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 ");
83 vars.massUncorr = mass_uncorr;
86 vars.dRFlightDir = deltaRFlightDir;
88 vars.nSingleTracks = nSingleTracks;
89 vars.nTracksAtVtx = nTracksAtVtx;
91 vars.energyFraction = energyFraction;
92 vars.significance3d = significance3d;
93 vars.deltaeta = deltaeta;
94 vars.deltaphi = deltaphi;
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." );
100 vars.massUncorr = mass_uncorr;
103 vars.dRFlightDir = deltaRFlightDir;
105 vars.nSingleTracks = nSingleTracks;
106 vars.nTracksAtVtx = nTracksAtVtx;
108 vars.energyFraction = energyFraction;
109 vars.significance3d = significance3d;
110 vars.deltaeta = deltaeta;
111 vars.deltaphi = deltaphi;
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;
381 vars.massUncorr = mass_uncorr;
384 vars.dRFlightDir = deltaRFlightDir;
386 vars.nSingleTracks = nSingleTracks;
387 vars.nTracksAtVtx = nTracksAtVtx;
389 vars.energyFraction = energyFraction;
390 vars.significance3d = significance3d;
391 vars.deltaeta = deltaeta;
392 vars.deltaphi = deltaphi;
393 return StatusCode::SUCCESS;