24 return StatusCode::SUCCESS;
35 if (!vertexInHandle.
isValid()) {
36 ATH_MSG_ERROR (
"Could not retrieve HiveDataObj with key " << vertexInHandle.
key());
37 return StatusCode::FAILURE;
39 vxContainer = vertexInHandle.
cptr();
42 if (vertexContainer !=
nullptr) {
43 vxContainer = vertexContainer;
47 return StatusCode::FAILURE;
52 if (vxContainer->
empty())
return StatusCode::SUCCESS;
57 primaryVertex = (*vxContainer)[0];
60 for (
const auto vertex : *vxContainer) {
62 primaryVertex = vertex;
69 if (primaryVertex) pTau.
setVertex(vxContainer, primaryVertex);
72 if (!
m_useTJVA)
return StatusCode::SUCCESS;
77 return StatusCode::FAILURE;
81 ATH_MSG_DEBUG(
"TJVA enabled -> try to find new PV for the tau candidate");
85 if (newPrimaryVertexLink.
isValid()) {
97 return StatusCode::SUCCESS;
107 std::vector<const xAOD::TrackParticle*> tracksForTJVA;
111 std::vector<const xAOD::TrackParticle*> assocTracks;
120 float sumTrackAll = 0.0;
121 for (
auto xTrack : assocTracks ) {
124 tracksForTJVA.push_back(xTrack);
129 ATH_MSG_WARNING(
"Original ERM track link is not available, skipping track");
132 auto original_id_track_link = acc_originalTrack(*xTrack);
133 if (!original_id_track_link.isValid()) {
134 ATH_MSG_WARNING(
"Original ERM track link is not valid, skipping track");
137 tracksForTJVA.push_back(*original_id_track_link);
139 sumTrackAll += xTrack->pt();
143 if (this->msgLevel() <= MSG::DEBUG){
144 ATH_MSG_DEBUG(
"tracksForTJVA # = " << tracksForTJVA.size() <<
", sum pT = " << sumTrackAll);
146 for (
uint i = 0; i < tracksForTJVA.size(); i++){
147 ATH_MSG_DEBUG(
"tracksForTJVA[" << i <<
"].pt = " << tracksForTJVA[i]->pt());
154 std::vector<const xAOD::Vertex*> vertVec;
156 vertVec.push_back(vert);
159 if (this->msgLevel() <= MSG::DEBUG){
161 for (
uint i = 0; i < vertVec.size(); i++){
169 if (this->msgLevel() <= MSG::DEBUG){
170 for (
const auto& [vtx, trks] : trktovxmap){
171 std::stringstream
ss;
172 for (
auto ass_trk : trks){
173 for (
uint i=0; i < tracksForTJVA.size(); i++){
174 if (ass_trk->p4() == tracksForTJVA[i]->p4()) {
180 ATH_MSG_DEBUG(
"Vtx[" << vtx->index() <<
"] associated with trks [" <<
ss.str() <<
"]");
188 std::vector<float> sumDz;
189 std::vector<float> v_jvf;
193 std::vector<const xAOD::TrackParticle*> tracks = trktovxmap[vert];
196 jvf = (sumTrackAll!=0. ? spair.first/sumTrackAll : 0.);
197 v_jvf.push_back(jvf);
198 sumDz.push_back(spair.second);
202 maxIndex = vert->index();
207 ATH_MSG_DEBUG(
"TJVA vtx found at z: " << vertices.
at(maxIndex)->
z() <<
" i_vtx = " << maxIndex <<
"jvf = " << maxJVF);
210 float min_sumDz = 99999999.;
212 ATH_MSG_DEBUG(
"i_vtx=" << vert->index() <<
", z=" << vert->z() <<
", JVF=" << v_jvf[vert->index()] <<
", sumDz=" << sumDz[vert->index()]);
213 if ( v_jvf[vert->index()] == maxJVF ){
215 if (sumDz[vert->index()] < min_sumDz){
216 min_sumDz = sumDz[vert->index()];
217 maxIndex = vert->index();
224 ATH_MSG_DEBUG(
"TJVA vtx found at z: " << vertices.
at(maxIndex)->
z() <<
" i_vtx = " << maxIndex);
233 float sumTrackPV = 0.;
234 float sumDeltaZ = 0.;
235 for (
auto trk : tracks){
236 sumTrackPV += trk->pt();
237 sumDeltaZ += std::abs(trk->z0() - vx_z + trk->vz());
240 return std::make_pair(sumTrackPV, sumDeltaZ);
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
const T * at(size_type n) const
Access an element, as an rvalue.
size_type size() const noexcept
Returns the number of elements in the collection.
bool empty() const noexcept
Returns true if the collection is empty.
ElementLink implementation for ROOT usage.
bool isValid() const
Test to see if the link can be dereferenced.
Helper class to provide constant type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
virtual const std::string & key() const override final
Return the StoreGate ID for the referenced object.
ElementLink< xAOD::VertexContainer > getPV_TJVA(const xAOD::TauJet &tauJet, const xAOD::VertexContainer &vertices, float &maxJVF) const
TauVertexFinder(const std::string &name)
Constructor and Destructor.
StatusCode initialize() override
Algorithm functions.
std::pair< float, float > getVertexScores(const std::vector< const xAOD::TrackParticle * > &tracks, float vx_z) const
ToolHandle< CP::ITrackVertexAssociationTool > m_trkVertexAssocTool
Gaudi::Property< std::string > m_assocTracksName
Gaudi::Property< double > m_dDeltaRMax
Gaudi::Property< bool > m_useTJVA
ToolHandle< InDet::IInDetTrackSelectionTool > m_TrackSelectionToolForTJVA
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexInputContainer
StatusCode executeVertexFinder(xAOD::TauJet &pTau, const xAOD::VertexContainer *vertexContainer=nullptr) const override
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackPartInputContainer
virtual FourMom_t p4() const
The full 4-momentum of the particle.
std::vector< const T * > getAssociatedObjects(const std::string &name) const
get associated objects as a vector<object> this compact form throws an exception if the object is not...
void setVertexLink(const VertexLink_t &vertexLink)
void setDetail(TauJetParameters::Detail detail, int value)
void setVertex(const xAOD::VertexContainer *cont, const xAOD::Vertex *vertex)
float z() const
Returns the z position.
@ TauJetVtxFraction
@Tau Jet Vertex Fraction
Jet_v1 Jet
Definition of the current "jet version".
std::map< const xAOD::Vertex *, xAOD::TrackVertexAssociationList > TrackVertexAssociationMap
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.
TauJet_v3 TauJet
Definition of the current "tau version".