diff --git a/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_VertexTruthMatching.cxx b/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_VertexTruthMatching.cxx index a6b21a33004b4279d8091b5c4a907d7180763539..57cb5998c16e9bcdb03081eae4a66b196a356976 100644 --- a/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_VertexTruthMatching.cxx +++ b/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_VertexTruthMatching.cxx @@ -286,19 +286,28 @@ const xAOD::TruthVertex* InDetPerfPlot_VertexTruthMatching::getTruthVertex(const const xAOD::TruthVertex* truthVtx = nullptr; if (recoVtx) { const static xAOD::Vertex::Decorator<std::vector<InDetVertexTruthMatchUtils::VertexTruthMatchInfo>> truthMatchingInfos("TruthEventMatchingInfos"); - const std::vector<InDetVertexTruthMatchUtils::VertexTruthMatchInfo>& truthInfos = truthMatchingInfos(*recoVtx); - if (!truthInfos.empty()) { - const InDetVertexTruthMatchUtils::VertexTruthMatchInfo& truthInfo = truthInfos.at(0); - const ElementLink<xAOD::TruthEventBaseContainer> truthEventLink = std::get<0>(truthInfo); - const xAOD::TruthEvent* truthEvent = nullptr; - if (truthEventLink.isValid()) { - truthEvent = static_cast<const xAOD::TruthEvent*>(*truthEventLink); - if (truthEvent) { - truthVtx = truthEvent->truthVertex(0); + try{ + if (!truthMatchingInfos.isAvailable(*recoVtx)){ + ATH_MSG_WARNING("TruthEventMatchingInfos DECORATOR not available -- returning nullptr!"); + return truthVtx; + } + const std::vector<InDetVertexTruthMatchUtils::VertexTruthMatchInfo>& truthInfos = truthMatchingInfos(*recoVtx); + if (!truthInfos.empty()) { + const InDetVertexTruthMatchUtils::VertexTruthMatchInfo& truthInfo = truthInfos.at(0); + const ElementLink<xAOD::TruthEventBaseContainer> truthEventLink = std::get<0>(truthInfo); + const xAOD::TruthEvent* truthEvent = nullptr; + if (truthEventLink.isValid()) { + truthEvent = static_cast<const xAOD::TruthEvent*>(*truthEventLink); + if (truthEvent) { + truthVtx = truthEvent->truthVertex(0); + } } } + else { + ATH_MSG_WARNING("TruthEventMatchingInfos DECORATOR yields empty vector -- returning nullptr!"); + } } - else { + catch (SG::ExcBadAuxVar &){ ATH_MSG_WARNING("TruthEventMatchingInfos DECORATOR yields empty vector -- returning nullptr!"); } } diff --git a/InnerDetector/InDetValidation/InDetTruthVertexValidation/Root/InDetVertexTruthMatchUtils.cxx b/InnerDetector/InDetValidation/InDetTruthVertexValidation/Root/InDetVertexTruthMatchUtils.cxx index 8c35e3c7c5b1236d3c04081f2e4efaf63fcda74d..cb0e6c6b0de876804756fce04bba5e643d7b2396 100644 --- a/InnerDetector/InDetValidation/InDetTruthVertexValidation/Root/InDetVertexTruthMatchUtils.cxx +++ b/InnerDetector/InDetValidation/InDetTruthVertexValidation/Root/InDetVertexTruthMatchUtils.cxx @@ -47,12 +47,20 @@ const std::vector<std::pair<const xAOD::Vertex*, size_t> > hardScatterMatches( c //loop and look for ( auto vxit : vxContainer ) { - const std::vector<VertexTruthMatchInfo> & info = matchInfoDecor( *vxit ); - for ( size_t i = 0; i < info.size(); ++i ) { - if ( isHardScatterEvent( std::get<0>(info[i]) ) ) { - result.push_back( std::make_pair(vxit, i) ); - break; + try{ + const std::vector<VertexTruthMatchInfo> & info = matchInfoDecor( *vxit ); + if (!matchInfoDecor.isAvailable(*vxit)){ + return result; } + for ( size_t i = 0; i < info.size(); ++i ) { + if ( isHardScatterEvent( std::get<0>(info[i]) ) ) { + result.push_back( std::make_pair(vxit, i) ); + break; + } + } + } + catch (SG::ExcBadAuxVar &){ + return result; } }