23 return StatusCode::SUCCESS;
34 if (!vertexInHandle.
isValid()) {
35 ATH_MSG_ERROR (
"Could not retrieve HiveDataObj with key " << vertexInHandle.
key());
36 return StatusCode::FAILURE;
38 vxContainer = vertexInHandle.
cptr();
41 if (vertexContainer !=
nullptr) {
42 vxContainer = vertexContainer;
46 return StatusCode::FAILURE;
51 if (vxContainer->
empty())
return StatusCode::SUCCESS;
56 primaryVertex = (*vxContainer)[0];
59 for (
const auto vertex : *vxContainer) {
61 primaryVertex = vertex;
68 if (primaryVertex) pTau.
setVertex(vxContainer, primaryVertex);
71 if (!
m_useTJVA)
return StatusCode::SUCCESS;
76 return StatusCode::FAILURE;
80 ATH_MSG_DEBUG(
"TJVA enabled -> try to find new PV for the tau candidate");
84 if (newPrimaryVertexLink.
isValid()) {
96 return StatusCode::SUCCESS;
106 std::vector<const xAOD::TrackParticle*> tracksForTJVA;
110 std::vector<const xAOD::TrackParticle*> assocTracks;
119 float sumTrackAll = 0.0;
120 for (
auto xTrack : assocTracks ) {
123 tracksForTJVA.push_back(xTrack);
128 ATH_MSG_WARNING(
"Original ERM track link is not available, skipping track");
131 auto original_id_track_link = acc_originalTrack(*xTrack);
132 if (!original_id_track_link.isValid()) {
133 ATH_MSG_WARNING(
"Original ERM track link is not valid, skipping track");
136 tracksForTJVA.push_back(*original_id_track_link);
138 sumTrackAll += xTrack->pt();
142 if (this->msgLevel() <= MSG::DEBUG){
143 ATH_MSG_DEBUG(
"tracksForTJVA # = " << tracksForTJVA.size() <<
", sum pT = " << sumTrackAll);
145 for (
uint i = 0; i < tracksForTJVA.size(); i++){
146 ATH_MSG_DEBUG(
"tracksForTJVA[" << i <<
"].pt = " << tracksForTJVA[i]->pt());
153 std::vector<const xAOD::Vertex*> vertVec;
155 vertVec.push_back(vert);
158 if (this->msgLevel() <= MSG::DEBUG){
160 for (
uint i = 0; i < vertVec.size(); i++){
168 if (this->msgLevel() <= MSG::DEBUG){
169 for (
const auto& [vtx, trks] : trktovxmap){
170 std::stringstream
ss;
171 for (
auto ass_trk : trks){
172 for (
uint i=0; i < tracksForTJVA.size(); i++){
173 if (ass_trk->p4() == tracksForTJVA[i]->p4()) {
179 ATH_MSG_DEBUG(
"Vtx[" << vtx->index() <<
"] associated with trks [" <<
ss.str() <<
"]");
187 std::vector<float> sumDz;
188 std::vector<float> v_jvf;
192 std::vector<const xAOD::TrackParticle*> tracks = trktovxmap[vert];
195 jvf = (sumTrackAll!=0. ? spair.first/sumTrackAll : 0.);
196 v_jvf.push_back(jvf);
197 sumDz.push_back(spair.second);
201 maxIndex = vert->index();
206 ATH_MSG_DEBUG(
"TJVA vtx found at z: " << vertices.
at(maxIndex)->
z() <<
" i_vtx = " << maxIndex <<
"jvf = " << maxJVF);
209 float min_sumDz = 99999999.;
211 ATH_MSG_DEBUG(
"i_vtx=" << vert->index() <<
", z=" << vert->z() <<
", JVF=" << v_jvf[vert->index()] <<
", sumDz=" << sumDz[vert->index()]);
212 if ( v_jvf[vert->index()] == maxJVF ){
214 if (sumDz[vert->index()] < min_sumDz){
215 min_sumDz = sumDz[vert->index()];
216 maxIndex = vert->index();
223 ATH_MSG_DEBUG(
"TJVA vtx found at z: " << vertices.
at(maxIndex)->
z() <<
" i_vtx = " << maxIndex);
232 float sumTrackPV = 0.;
233 float sumDeltaZ = 0.;
234 for (
auto trk : tracks){
235 sumTrackPV += trk->pt();
236 sumDeltaZ += std::abs(trk->z0() - vx_z + trk->vz());
239 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
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".