32 declareProperty(
"IgnoreFlags" ,
m_noFlags);
45 ATH_CHECK(m_vertexContainerNames.initialize(m_streamName));
48 if (m_passFlags.empty()) {
50 return StatusCode::FAILURE;
52 for(
auto itr = m_passFlags.cbegin(); itr!=m_passFlags.cend(); ++itr) {
53 ATH_MSG_INFO(
"Vertices must pass the \"" << itr->key() <<
"\" selection");
57 for(
auto &
key : m_passFlags){
58 key = m_vertexContainerNames.key() +
'.' +
key.key();
61 return StatusCode::SUCCESS;
67 ATH_MSG_INFO(
"Processed "<< m_nVtxTot <<
" vertices, "<< m_nVtxPass<<
" were retained ");
69 return StatusCode::SUCCESS;
76 const EventContext& ctx = Gaudi::Hive::currentContext();
78 std::vector<bool> vtxMask(vertexContainer->size(),
true);
83 std::vector<SG::ReadDecorHandle<xAOD::VertexContainer, Char_t>> handles;
84 handles.reserve(m_passFlags.size());
85 for(
const auto &
key : m_passFlags){
86 handles.emplace_back(
key, ctx);
87 if(!handles.back().isPresent())
return StatusCode::FAILURE;
89 for(
auto vtxItr = vertexContainer->cbegin(); vtxItr!=vertexContainer->cend(); ++vtxItr, ++
k) {
93 if(m_noFlags){
passed =
true; vtxTot++; }
95 for(
auto &flagAcc : handles) {
96 if(flagAcc(*vtx) != 0) {
105 if(vtxMask[
k] ==
false)
continue;
114 std::vector<const xAOD::TrackParticle*> presentVertex, compareVertex;
117 presentVertex.clear();
121 sort( presentVertex.begin(), presentVertex.end() );
125 for(
auto vtxLoopItr = vtxItr+1; vtxLoopItr!=vertexContainer->cend(); vtxLoopItr++, loop_k++){
135 compareVertex.clear();
140 std::sort( compareVertex.begin(), compareVertex.end());
142 vtxMask[loop_k] =
false;
145 ATH_MSG_DEBUG(std::setw(14)<<compareVertex[0]<<std::setw(14) << compareVertex[1]<<std::setw(14)<<compareVertex[2]);
146 ATH_MSG_DEBUG(std::setw(14)<<presentVertex[0]<<std::setw(14) << presentVertex[1]<<std::setw(14)<<presentVertex[2]);
149 if( compareVertex[j] != presentVertex[j] ){vtxMask[loop_k] =
true;
break;}
151 ATH_MSG_DEBUG(
"Verdict:"<<(vtxMask[loop_k]?
"keep":
"erase") );
160 vertexContainer.
keep(vtxMask);
162 m_nVtxTot.fetch_add( vtxTot, std::memory_order_relaxed);
163 m_nVtxPass.fetch_add( nVtxPass, std::memory_order_relaxed);
167 return StatusCode::SUCCESS;