ATLAS Offline Software
Loading...
Searching...
No Matches
MSVVariablesFactory.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
16
20
21#include <TMath.h>
22
23#include "CLHEP/Vector/LorentzVector.h"
25
28
30
31#include "xAODTracking/Vertex.h"
34
35#include <vector>
36#include <string>
37
38namespace Analysis {
39
41 const std::string& n,
42 const IInterface* p):
43 AthAlgTool(name, n,p)
44 {
45 declareInterface<IMSVVariablesFactory>(this);
46 }
47
49 ATH_MSG_DEBUG(" Initialization of MSVVariablesFactory succesfull");
50 return StatusCode::SUCCESS;
51 }
52
54 ATH_MSG_DEBUG(" Finalization of MSVVariablesFactory succesfull");
55 return StatusCode::SUCCESS;
56 }
57
59 (const xAOD::Jet &myJet, const Trk::VxSecVKalVertexInfo* myVertexInfoVKal,
60 xAOD::VertexContainer* VertexContainer,const xAOD::Vertex& PrimaryVtx) const {
61
62 Amg::Vector3D jet_V3(myJet.p4().Px(), myJet.p4().Py(), myJet.p4().Pz());
63 float jetenergy=0.;
64 const xAOD::Vertex* priVtx = &PrimaryVtx;
65 std::vector< ElementLink< xAOD::VertexContainer > > MSVVertexLinks;
66 const std::vector<xAOD::Vertex*> myVertices = myVertexInfoVKal->vertices();
67 if(myVertices.empty()){
68 ATH_MSG_DEBUG("#BTAG# no MSV vertices...fill default values only... ");
69 xAOD::Vertex* vertex = new xAOD::Vertex();
70 VertexContainer->push_back(vertex);
78 return StatusCode::SUCCESS;
79 }
80
81 jetenergy = myVertexInfoVKal->energyTrkInJet();
82
83 for (const auto& vertex : myVertexInfoVKal->vertices()){
84 VertexContainer->push_back(vertex);
85 //additional info per vertex
86 double sumpx = 0.0;
87 double sumpy = 0.0;
88 double sumpz = 0.0;
89 double sume = 0.0;
90 const std::vector<ElementLink<xAOD::TrackParticleContainer> > myTrackLinks = vertex->trackParticleLinks();
91 if (myTrackLinks.empty()) {
92 ATH_MSG_WARNING("#BTAG# No Track Links attached to the track at the sec vertex... ");
93 }
94 int npsec = 0;
95 const std::vector<Trk::VxTrackAtVertex> myTracks=vertex->vxTrackAtVertex();
96 if (!myTracks.empty()) {
97 npsec=myTracks.size();
98 for (const auto& track : myTracks) {
99 const Trk::Perigee* perigee = dynamic_cast<const Trk::Perigee*>(track.perigeeAtVertex());
100 if(perigee){
101 sumpx += perigee->momentum().x();
102 sumpy += perigee->momentum().y();
103 sumpz += perigee->momentum().z();
104 sume += std::hypot(perigee->momentum().mag(), ParticleConstants::chargedPionMassInMeV);
105 }else{
106 ATH_MSG_WARNING("#BTAG# perigee for VxTrackAtVertex not found");
107 }
108 }
109 }
110
111 CLHEP::HepLorentzVector vtxp4(sumpx,sumpy,sumpz,sume);
112 float efrac = (jetenergy>0) ? vtxp4.e()/jetenergy : 0;
113 xAOD::SecVtxHelper::setVertexMass(vertex, vtxp4.m());
115 xAOD::SecVtxHelper::setVtxNtrk(vertex, npsec);
116 xAOD::SecVtxHelper::setVtxpt(vertex, vtxp4.perp());
117 xAOD::SecVtxHelper::setVtxeta(vertex, vtxp4.eta());
118 xAOD::SecVtxHelper::setVtxphi(vertex, vtxp4.phi());
119
120 ATH_MSG_DEBUG("#BTAG# mass per vertex = "<<vtxp4.m());
121 double localdistnrm = 0;
122 std::vector<const xAOD::Vertex*> vecVtxHolder;
123 vecVtxHolder.push_back(vertex);
124
125 if (priVtx) {
126 ATH_MSG_DEBUG("Factory PVX x = " << priVtx->x() << " y = " << priVtx->y() << " z = " << priVtx->z());
127 localdistnrm = get3DSignificance(*priVtx, vecVtxHolder, jet_V3);
128 } else {
129 ATH_MSG_WARNING("#BTAG# Tagging requested, but no primary vertex supplied.");
130 }
131 xAOD::SecVtxHelper::setVtxnormDist(vertex, localdistnrm);
132 //track links,
133 vertex->setTrackParticleLinks(myTrackLinks);
134
135 } //end loop vertexcontainer
136
137 return StatusCode::SUCCESS;
138 }
139
141 (const xAOD::Jet &myJet, xAOD::BTagging* BTag,
142 const Trk::VxSecVKalVertexInfo* myVertexInfoVKal,
143 xAOD::VertexContainer* VertexContainer, const xAOD::Vertex& PrimaryVtx,
144 std::string basename) const {
145
146 Amg::Vector3D jet_V3(myJet.p4().Px(), myJet.p4().Py(), myJet.p4().Pz());
147 int nvsec = 0;
148 float jetenergy = 0.;
149 int n2t = 0;
150 float distnrm = 0.;
151 const xAOD::Vertex* priVtx = &PrimaryVtx;
152 std::vector< ElementLink< xAOD::VertexContainer > > MSVVertexLinks;
153 const std::vector<xAOD::Vertex*> myVertices = myVertexInfoVKal->vertices();
154 if(myVertices.empty()){
155 ATH_MSG_DEBUG("#BTAG# no MSV vertices...fill default values only... ");
156 BTag->setVariable<int>(basename, "N2Tpair", n2t);
157 BTag->setVariable<float>(basename, "energyTrkInJet", jetenergy);
158 BTag->setVariable<int>(basename, "nvsec", nvsec);
159 BTag->setVariable<float>(basename, "normdist", distnrm);
160 BTag->setVariable<std::vector<ElementLink<xAOD::VertexContainer> > >(basename, "vertices", MSVVertexLinks);
161 BTag->setDynVxELName(basename, "vertices");
162 xAOD::Vertex* vertex = new xAOD::Vertex();
163 VertexContainer->push_back(vertex);
167 xAOD::SecVtxHelper::setVtxpt(vertex, -9.);
171 return StatusCode::SUCCESS;
172 }
173
174 jetenergy = myVertexInfoVKal->energyTrkInJet();
175 n2t = myVertexInfoVKal->n2trackvertices();
176 BTag->setVariable<int>(basename, "N2Tpair", n2t);
177 BTag->setVariable<float>(basename, "energyTrkInJet", jetenergy);
178
179 std::vector<const xAOD::Vertex*> vecVertices;
180 for (const auto& vertex : myVertexInfoVKal->vertices()) {
181 VertexContainer->push_back(vertex);
182 //additional info per vertex
183 vecVertices.push_back(vertex);
184 double sumpx = 0.0;
185 double sumpy = 0.0;
186 double sumpz = 0.0;
187 double sume = 0.0;
188 const std::vector<ElementLink<xAOD::TrackParticleContainer> > myTrackLinks = vertex->trackParticleLinks();
189 if (myTrackLinks.empty()) {
190 ATH_MSG_WARNING("#BTAG# No Track Links attached to the track at the sec vertex... ");
191 }
192 int npsec = 0;
193 const std::vector<Trk::VxTrackAtVertex> myTracks=vertex->vxTrackAtVertex();
194 if (!myTracks.empty()) {
195 npsec=myTracks.size();
196 for (const auto& track : myTracks) {
197 const Trk::Perigee* perigee = dynamic_cast<const Trk::Perigee*>(track.perigeeAtVertex());
198 if(perigee){
199 sumpx += perigee->momentum().x();
200 sumpy += perigee->momentum().y();
201 sumpz += perigee->momentum().z();
202 sume += std::hypot(perigee->momentum().mag(), ParticleConstants::chargedPionMassInMeV);
203 }else{
204 ATH_MSG_WARNING("#BTAG# perigee for VxTrackAtVertex not found");
205 }
206 }
207 }
208
209 CLHEP::HepLorentzVector vtxp4(sumpx,sumpy,sumpz,sume);
210 float efrac = (jetenergy>0) ? vtxp4.e()/jetenergy : 0;
211 xAOD::SecVtxHelper::setVertexMass(vertex, vtxp4.m());
213 xAOD::SecVtxHelper::setVtxNtrk(vertex, npsec);
214 xAOD::SecVtxHelper::setVtxpt(vertex, vtxp4.perp());
215 xAOD::SecVtxHelper::setVtxeta(vertex, vtxp4.eta());
216 xAOD::SecVtxHelper::setVtxphi(vertex, vtxp4.phi());
217
218 ATH_MSG_DEBUG("#BTAG# mass per vertex = "<<vtxp4.m());
219 double localdistnrm = 0;
220 std::vector<const xAOD::Vertex*> vecVtxHolder;
221 vecVtxHolder.push_back(vertex);
222
223
224 if (priVtx) {
225 ATH_MSG_DEBUG("Factory PVX x = " << priVtx->x() << " y = " << priVtx->y() << " z = " << priVtx->z());
226 localdistnrm = get3DSignificance(*priVtx, vecVtxHolder, jet_V3);
227 } else {
228 ATH_MSG_WARNING("#BTAG# Tagging requested, but no primary vertex supplied.");
229 }
230 xAOD::SecVtxHelper::setVtxnormDist(vertex, localdistnrm);
231 //track links,
232 vertex->setTrackParticleLinks(myTrackLinks);
233
235 linkBTagVertex.toContainedElement(*VertexContainer, vertex);
236 MSVVertexLinks.push_back(linkBTagVertex);
237 } //end loop vertexcontainer
238
239 BTag->setVariable<std::vector<ElementLink<xAOD::VertexContainer> > >(basename, "vertices", MSVVertexLinks);
240 BTag->setDynVxELName(basename, "vertices");
241
242 if (priVtx) {
243 distnrm = get3DSignificance(*priVtx, vecVertices, jet_V3);
244 } else {
245 ATH_MSG_WARNING("#BTAG# Tagging requested, but no primary vertex supplied.");
246 distnrm=0.;
247 }
248 nvsec = vecVertices.size();
249 BTag->setVariable<int>(basename, "nvsec", nvsec);
250 BTag->setVariable<float>(basename, "normdist", distnrm);
251
252 return StatusCode::SUCCESS;
253
254 }
255
256}//end Analysis namespace
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_WARNING(x,...)
virtual StatusCode initialize() override
virtual StatusCode createMSVContainer(const xAOD::Jet &, const Trk::VxSecVKalVertexInfo *myInfoVKal, xAOD::VertexContainer *btagVertex, const xAOD::Vertex &PV) const override
virtual StatusCode fillMSVVariables(const xAOD::Jet &, xAOD::BTagging *BTag, const Trk::VxSecVKalVertexInfo *myInfoVKal, xAOD::VertexContainer *btagVertex, const xAOD::Vertex &PV, std::string basename) const override
virtual StatusCode finalize() override
MSVVariablesFactory(const std::string &name, const std::string &n, const IInterface *p)
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
const Amg::Vector3D & momentum() const
Access method for the momentum.
const std::vector< xAOD::Vertex * > & vertices() const
virtual FourMom_t p4() const
The full 4-momentum of the particle.
Definition Jet_v1.cxx:71
float z() const
Returns the z position.
float y() const
Returns the y position.
float x() const
Returns the x position.
Eigen::Matrix< double, 3, 1 > Vector3D
The namespace of all packages in PhysicsAnalysis/JetTagging.
double get3DSignificance(const xAOD::Vertex &priVertex, const std::vector< const xAOD::Vertex * > &secVertex, const Amg::Vector3D &jetDirection)
Signed decay length significance of the weighted mean of the secondary vertices with respect to the p...
constexpr double chargedPionMassInMeV
the mass of the charged pion (in MeV)
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
void setVtxeta(xAOD::Vertex *, float value)
void setVertexMass(xAOD::Vertex *, float value)
void setVtxNtrk(xAOD::Vertex *, int value)
void setVtxpt(xAOD::Vertex *, float value)
void setVtxnormDist(xAOD::Vertex *, float value)
void setEnergyFraction(xAOD::Vertex *, float value)
void setVtxphi(xAOD::Vertex *, float value)
Jet_v1 Jet
Definition of the current "jet version".
BTagging_v1 BTagging
Definition of the current "BTagging version".
Definition BTagging.h:17
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.
std::string basename(std::string name)
Definition utils.cxx:207