17 #include "GaudiKernel/MsgStream.h"
48 return StatusCode::SUCCESS;
53 std::unique_ptr<xAOD::TrackParticleContainer> outputRecoReplacedWithPseudo = std::make_unique<xAOD::TrackParticleContainer>();
54 std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoReplacedWithPseudoAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
55 outputRecoReplacedWithPseudo->setStore(outputRecoReplacedWithPseudoAux.get());
56 std::unique_ptr<xAOD::TrackParticleContainer> outputRecoReplacedWithPseudoFromB = std::make_unique<xAOD::TrackParticleContainer>();
57 std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoReplacedWithPseudoFromBAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
58 outputRecoReplacedWithPseudoFromB->setStore(outputRecoReplacedWithPseudoFromBAux.get());
59 std::unique_ptr<xAOD::TrackParticleContainer> outputRecoReplacedWithPseudoNotFromB = std::make_unique<xAOD::TrackParticleContainer>();
60 std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoReplacedWithPseudoNotFromBAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
61 outputRecoReplacedWithPseudoNotFromB->setStore(outputRecoReplacedWithPseudoNotFromBAux.get());
62 std::unique_ptr<xAOD::TrackParticleContainer> outputRecoPlusPseudo = std::make_unique<xAOD::TrackParticleContainer>();
63 std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoPlusPseudoAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
64 outputRecoPlusPseudo->setStore(outputRecoPlusPseudoAux.get());
65 std::unique_ptr<xAOD::TrackParticleContainer> outputRecoPlusPseudoFromB = std::make_unique<xAOD::TrackParticleContainer>();
66 std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoPlusPseudoFromBAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
67 outputRecoPlusPseudoFromB->setStore(outputRecoPlusPseudoFromBAux.get());
68 std::unique_ptr<xAOD::TrackParticleContainer> outputRecoPlusPseudoNotFromB = std::make_unique<xAOD::TrackParticleContainer>();
69 std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoPlusPseudoNotFromBAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
70 outputRecoPlusPseudoNotFromB->setStore(outputRecoPlusPseudoNotFromBAux.get());
71 std::unique_ptr<xAOD::TrackParticleContainer> outputRecoNoFakes = std::make_unique<xAOD::TrackParticleContainer>();
72 std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoNoFakesAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
73 outputRecoNoFakes->setStore(outputRecoNoFakesAux.get());
74 std::unique_ptr<xAOD::TrackParticleContainer> outputRecoNoFakesFromB = std::make_unique<xAOD::TrackParticleContainer>();
75 std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoNoFakesFromBAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
76 outputRecoNoFakesFromB->setStore(outputRecoNoFakesFromBAux.get());
77 std::unique_ptr<xAOD::TrackParticleContainer> outputRecoNoFakesNotFromB = std::make_unique<xAOD::TrackParticleContainer>();
78 std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoNoFakesNotFromBAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
79 outputRecoNoFakesNotFromB->setStore(outputRecoNoFakesNotFromBAux.get());
86 if (!recoTrackParticleCol.
isValid()){
88 return StatusCode::FAILURE;
90 if (!pseudoTrackParticleCol.
isValid()){
92 return StatusCode::FAILURE;
101 fillRecoPlusPseudo(recoTrackParticleCol.
cptr(), pseudoTrackParticleCol.
cptr(), outputRecoPlusPseudoNotFromB.get(),
false,
true);
104 fillRecoNoFakes(recoTrackParticleCol.
cptr(), outputRecoNoFakesNotFromB.get(),
false,
true);
107 ATH_MSG_DEBUG(
"outputRecoReplacedWithPseudo has "<<outputRecoReplacedWithPseudo.get()->
size()<<
" tracks");
109 ATH_CHECK(h_write_recoReplacedWithPseudo.
record(std::move(outputRecoReplacedWithPseudo), std::move(outputRecoReplacedWithPseudoAux)));
112 ATH_MSG_DEBUG(
"outputRecoReplacedWithPseudoFromB has "<<outputRecoReplacedWithPseudoFromB.get()->
size()<<
" tracks");
114 ATH_CHECK(h_write_recoReplacedWithPseudoFromB.
record(std::move(outputRecoReplacedWithPseudoFromB), std::move(outputRecoReplacedWithPseudoFromBAux)));
117 ATH_MSG_DEBUG(
"outputRecoReplacedWithPseudoNotFromB has "<<outputRecoReplacedWithPseudoNotFromB.get()->
size()<<
" tracks");
119 ATH_CHECK(h_write_recoReplacedWithPseudoNotFromB.
record(std::move(outputRecoReplacedWithPseudoNotFromB), std::move(outputRecoReplacedWithPseudoNotFromBAux)));
122 ATH_MSG_DEBUG(
"outputRecoPlusPseudo has "<<outputRecoPlusPseudo.get()->
size()<<
" tracks");
124 ATH_CHECK(h_write_recoPlusPseudo.
record(std::move(outputRecoPlusPseudo), std::move(outputRecoPlusPseudoAux)));
127 ATH_MSG_DEBUG(
"outputRecoPlusPseudoFromB has "<<outputRecoPlusPseudoFromB.get()->
size()<<
" tracks");
129 ATH_CHECK(h_write_recoPlusPseudoFromB.
record(std::move(outputRecoPlusPseudoFromB), std::move(outputRecoPlusPseudoFromBAux)));
132 ATH_MSG_DEBUG(
"outputRecoPlusPseudoNotFromB has "<<outputRecoPlusPseudoNotFromB.get()->
size()<<
" tracks");
134 ATH_CHECK(h_write_recoPlusPseudoNotFromB.
record(std::move(outputRecoPlusPseudoNotFromB), std::move(outputRecoPlusPseudoNotFromBAux)));
137 ATH_MSG_DEBUG(
"outputRecoNoFakes has "<<outputRecoNoFakes.get()->
size()<<
" tracks");
139 ATH_CHECK(h_write_recoNoFakes.
record(std::move(outputRecoNoFakes), std::move(outputRecoNoFakesAux)));
142 ATH_MSG_DEBUG(
"outputRecoNoFakesFromB has "<<outputRecoNoFakesFromB.get()->
size()<<
" tracks");
144 ATH_CHECK(h_write_recoNoFakesFromB.
record(std::move(outputRecoNoFakesFromB), std::move(outputRecoNoFakesFromBAux)));
147 ATH_MSG_DEBUG(
"outputRecoNoFakesNotFromB has "<<outputRecoNoFakesNotFromB.get()->
size()<<
" tracks");
149 ATH_CHECK(h_write_recoNoFakesNotFromB.
record(std::move(outputRecoNoFakesNotFromB), std::move(outputRecoNoFakesNotFromBAux)));
152 return StatusCode::SUCCESS;
163 bool onlyNotFromB )
const
165 ATH_MSG_DEBUG(
"Start fillRecoReplacedWithPseudo with onlyFromB = "<<onlyFromB<<
" and onlyNotFromB = "<<onlyNotFromB);
167 if((recoTrackParticleCol && !recoTrackParticleCol->
empty()) &&
168 (pseudoTrackParticleCol && !pseudoTrackParticleCol->
empty())) {
169 ATH_MSG_DEBUG(
"Size of reco track particle collection " << recoTrackParticleCol->
size());
170 ATH_MSG_DEBUG(
"Size of pseudo track particle collection " << pseudoTrackParticleCol->
size());
173 for(
const auto *
const tp_reco: *recoTrackParticleCol){
177 bool match_found =
false;
179 for(
const auto *
const tp_pseudo: *pseudoTrackParticleCol){
181 if (truth_reco == truth_pseudo){
185 if (!onlyFromB && !onlyNotFromB){
234 ATH_MSG_DEBUG(
"reco track that has truth link DOES NOT have truth-matched pseudo track! :(");
241 ATH_MSG_DEBUG(
"Size of output track particle collection " << outputCol->
size() <<
" (sanity: "<<n_saved<<
")");
249 bool onlyNotFromB )
const
251 ATH_MSG_DEBUG(
"Start fillRecoPlusPseudo with onlyFromB = "<<onlyFromB<<
" and onlyNotFromB = "<<onlyNotFromB);
253 if((recoTrackParticleCol && !recoTrackParticleCol->
empty()) &&
254 (pseudoTrackParticleCol && !pseudoTrackParticleCol->
empty())) {
255 ATH_MSG_DEBUG(
"Size of reco track particle collection " << recoTrackParticleCol->
size());
256 ATH_MSG_DEBUG(
"Size of pseudo track particle collection " << pseudoTrackParticleCol->
size());
259 for(
const auto *
const tp_reco: *recoTrackParticleCol){
265 for(
const auto *
const tp_pseudo: *pseudoTrackParticleCol){
266 bool match_found =
false;
268 for(
const auto *
const tp_reco: *recoTrackParticleCol){
272 if (truth_reco == truth_pseudo){
283 ATH_MSG_DEBUG(
"no match found, so adding pseudo track to output");
284 if(!onlyFromB && !onlyNotFromB){
306 ATH_MSG_DEBUG(
"match found so not adding pseudo track to output");
309 ATH_MSG_DEBUG(
"Size of output track particle collection " << outputCol->
size() <<
" (sanity: "<<n_saved<<
")");
316 bool onlyNotFromB )
const
318 ATH_MSG_DEBUG(
"Start fillRecoNoFakes with onlyFromB = "<<onlyFromB<<
" and onlyNotFromB = "<<onlyNotFromB);
320 if((recoTrackParticleCol && !recoTrackParticleCol->
empty())){
321 ATH_MSG_DEBUG(
"Size of reco track particle collection " << recoTrackParticleCol->
size());
326 for(
const auto *
const tp_reco: *recoTrackParticleCol){
328 if (!onlyFromB && !onlyNotFromB){
329 if( acc_truthProb( *tp_reco ) < 0.5) {
337 if( acc_truthProb( *tp_reco ) < 0.5) {
343 if( acc_truthProb( *tp_reco ) < 0.5) {
353 ATH_MSG_DEBUG(
"Size of output track particle collection " << outputCol->
size() <<
" (sanity: "<<n_saved<<
")");
380 linkedTruthParticle = (*link);
381 return linkedTruthParticle;