139 if (vxContainer.
empty() ||
142 return StatusCode::SUCCESS;
151 std::vector<const xAOD::TruthEventBaseContainer *> truthContainers;
152 truthContainers.push_back( truthEvents );
161 truthContainers.push_back( truthPileup );
170 ATH_MSG_WARNING(
"Vertex container has no vertices with valid TrackParticle links");
171 return StatusCode::SUCCESS;
178 createTrackTruthMap( truthContainers, *tkContainer,
m_trkMatchProb );
212 unsigned int n_bad_links = 0;
213 unsigned int n_links = 0;
214 unsigned int n_vx_with_bad_links = 0;
216 for (
auto vxit : vxContainer.
stdcont() ) {
228 std::vector<VertexTruthMatchInfo> matchinfo;
229 std::vector<VertexTruthMatchInfo> rawMatchinfo;
233 ATH_MSG_DEBUG(
"trackParticles or trackWeights not available, setting fake");
236 matchInfoDecor( *vxit ) = matchinfo;
238 rawMatchInfoDecor( *vxit ) = rawMatchinfo;
239 nHSTrkDecor( *vxit ) = 0;
245 ntracks = trkParts.size();
246 const std::vector<float> & trkWeights = weightAcc( *vxit );
249 if ( trkWeights.size() != ntracks ) {
250 ATH_MSG_DEBUG(
"Vertex without same number of tracks and trackWeights, setting fake");
252 matchInfoDecor( *vxit ) = matchinfo;
254 rawMatchInfoDecor( *vxit ) = rawMatchinfo;
255 nHSTrkDecor( *vxit ) = 0;
259 ATH_MSG_DEBUG(
"Matching new vertex at (" << vxit->x() <<
", " << vxit->y() <<
", " << vxit->z() <<
")" <<
" with " << ntracks <<
" tracks, at index: " << vxit->index());
261 float totalWeight = 0.;
262 float totalFake = 0.;
265 unsigned vx_n_bad_links = 0;
267 for (
size_t t = 0; t < ntracks; ++t ) {
274 totalWeight += trkWeights[t];
276 trk_wtVtx(trk) = trkWeights[t];
279 float prob = trk_truthProbAcc( trk );
281 if (!truthPartLink.
isValid())
continue;
286 if (
pass( truthPart) ) {
289 if (
match.isValid() ) {
290 size_t matchIdx = indexOfMatchInfo( matchinfo,
match );
291 std::get<1>(matchinfo[matchIdx]) += trkWeights[t];
292 std::get<2>(matchinfo[matchIdx]) += (trk.
pt()/1000.) * (trk.
pt()/1000.) * trkWeights[t];
293 matchIdx = indexOfMatchInfo( rawMatchinfo,
match );
294 std::get<1>(rawMatchinfo[matchIdx]) += trkWeights[t];
295 std::get<2>(rawMatchinfo[matchIdx]) += (trk.
pt()/1000.) * (trk.
pt()/1000.) * trkWeights[t];
298 totalFake += trkWeights[t];
303 totalFake += trkWeights[t];
307 totalFake += trkWeights[t];
311 n_bad_links += vx_n_bad_links;
312 if (vx_n_bad_links>0) {
313 ++n_vx_with_bad_links;
317 if ( totalWeight < 1e-12 ) {
318 ATH_MSG_DEBUG(
" Declaring vertex fully fake (no passing tracks included)");
322 if ( totalFake > 0. )
328 for (
auto & mit : matchinfo ) {
329 std::get<1>(mit) /= totalWeight;
331 std::sort( matchinfo.begin(), matchinfo.end(), compareMatchPair );
332 std::sort( rawMatchinfo.begin(), rawMatchinfo.end(), compareMatchPair );
333 matchInfoDecor( *vxit ) = matchinfo;
334 rawMatchInfoDecor( *vxit ) = rawMatchinfo;
335 nHSTrkDecor( *vxit ) = nHSTrk;
347 std::vector<bool> assignedType( vxContainer.
size(),
false );
349 for (
size_t i = 0; i < vxContainer.
size(); ++i ) {
351 if ( assignedType[i] )
continue;
353 std::vector<VertexTruthMatchInfo> & info = matchInfoDecor( *vxContainer[i] );
355 matchTypeDecor( *vxContainer[i] ) =
DUMMY;
356 }
else if ( !std::get<0>(info[0]).
isValid() ) {
357 matchTypeDecor( *vxContainer[i] ) =
FAKE;
359 matchTypeDecor( *vxContainer[i] ) =
MATCHED;
361 matchTypeDecor( *vxContainer[i] ) =
MERGED;
365 if ( matchTypeDecor( *vxContainer[i] ) ==
MATCHED || matchTypeDecor( *vxContainer[i] ) ==
MERGED ) {
366 std::vector<size_t> foundSplits;
367 for (
size_t j = i + 1; j < vxContainer.
size(); ++j ) {
368 std::vector<VertexTruthMatchInfo> & info2 = matchInfoDecor( *vxContainer[j] );
372 if (matchTypeDecor( *vxContainer[j] ) ==
FAKE || matchTypeDecor( *vxContainer[j] ) ==
DUMMY)
continue;
373 if (!info2.empty() && std::get<0>(info2[0]).isValid() && std::get<0>(info[0]).key() == std::get<0>(info2[0]).key() && std::get<0>(info[0]).index() == std::get<0>(info2[0]).index() ) {
375 splitPartnerDecor( *vxContainer[i] ).emplace_back( vxContainer, j );
376 splitPartnerDecor( *vxContainer[j] ).emplace_back( vxContainer, i );
378 for (
auto k : foundSplits ) {
379 splitPartnerDecor( *vxContainer[k] ).emplace_back( vxContainer, j );
380 splitPartnerDecor( *vxContainer[j] ).emplace_back( vxContainer, k );
383 foundSplits.push_back(j);
388 float maxSumpT2 = std::get<2>( matchInfoDecor( *vxContainer[i] )[0] );
389 size_t indexOfMax = i;
390 for (
auto l : foundSplits ) {
391 if ( std::get<2>( matchInfoDecor( *vxContainer[l] )[0] ) > maxSumpT2 ){
392 maxSumpT2 = std::get<2>( matchInfoDecor( *vxContainer[l] )[0] );
395 matchTypeDecor( *vxContainer[l] ) =
SPLIT;
396 assignedType[l] =
true;
399 if ( indexOfMax!=i ) matchTypeDecor( *vxContainer[i] ) =
SPLIT;
405 for (
const auto &vxit : vxContainer.
stdcont() ) {
406 ATH_MSG_DEBUG(
"Matched vertex (index " << (*vxit).index() <<
") to type " << matchTypeDecor(*vxit) <<
" with following info of size " << matchInfoDecor(*vxit).size() <<
":");
407 for (
const auto &vit : matchInfoDecor(*vxit) ) {
408 if ( std::get<0>(vit).
isValid() ) {
409 ATH_MSG_DEBUG(
" GenEvent type " << (* std::get<0>(vit))->
type() <<
", index " << std::get<0>(vit).
index() <<
" with relative weight " << std::get<1>(vit) );
411 ATH_MSG_DEBUG(
" Fakes with relative weight " << std::get<1>(vit) );
414 if (matchTypeDecor(*vxit) ==
SPLIT) {
416 for (
const auto &
split : splitPartnerDecor( *vxit ) ) {
417 if (
split.isValid() )
426 return StatusCode::SUCCESS;
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
std::tuple< ElementLink< xAOD::TruthEventBaseContainer >, float, float > VertexTruthMatchInfo