17 #include "GaudiKernel/MsgStream.h"
29 const IInterface*
p) : base_class(
t,
n,
p)
64 return StatusCode::SUCCESS;
73 return StatusCode::SUCCESS;
78 const EventContext& ctx = Gaudi::Hive::currentContext();
79 std::unique_ptr<xAOD::TrackParticleContainer> outputRecoReplacedWithPseudo = std::make_unique<xAOD::TrackParticleContainer>();
80 std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoReplacedWithPseudoAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
81 outputRecoReplacedWithPseudo->setStore(outputRecoReplacedWithPseudoAux.get());
82 std::unique_ptr<xAOD::TrackParticleContainer> outputRecoReplacedWithPseudoFromB = std::make_unique<xAOD::TrackParticleContainer>();
83 std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoReplacedWithPseudoFromBAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
84 outputRecoReplacedWithPseudoFromB->setStore(outputRecoReplacedWithPseudoFromBAux.get());
85 std::unique_ptr<xAOD::TrackParticleContainer> outputRecoReplacedWithPseudoNotFromB = std::make_unique<xAOD::TrackParticleContainer>();
86 std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoReplacedWithPseudoNotFromBAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
87 outputRecoReplacedWithPseudoNotFromB->setStore(outputRecoReplacedWithPseudoNotFromBAux.get());
88 std::unique_ptr<xAOD::TrackParticleContainer> outputRecoPlusPseudo = std::make_unique<xAOD::TrackParticleContainer>();
89 std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoPlusPseudoAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
90 outputRecoPlusPseudo->setStore(outputRecoPlusPseudoAux.get());
91 std::unique_ptr<xAOD::TrackParticleContainer> outputRecoPlusPseudoFromB = std::make_unique<xAOD::TrackParticleContainer>();
92 std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoPlusPseudoFromBAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
93 outputRecoPlusPseudoFromB->setStore(outputRecoPlusPseudoFromBAux.get());
94 std::unique_ptr<xAOD::TrackParticleContainer> outputRecoPlusPseudoNotFromB = std::make_unique<xAOD::TrackParticleContainer>();
95 std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoPlusPseudoNotFromBAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
96 outputRecoPlusPseudoNotFromB->setStore(outputRecoPlusPseudoNotFromBAux.get());
97 std::unique_ptr<xAOD::TrackParticleContainer> outputRecoNoFakes = std::make_unique<xAOD::TrackParticleContainer>();
98 std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoNoFakesAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
99 outputRecoNoFakes->setStore(outputRecoNoFakesAux.get());
100 std::unique_ptr<xAOD::TrackParticleContainer> outputRecoNoFakesFromB = std::make_unique<xAOD::TrackParticleContainer>();
101 std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoNoFakesFromBAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
102 outputRecoNoFakesFromB->setStore(outputRecoNoFakesFromBAux.get());
103 std::unique_ptr<xAOD::TrackParticleContainer> outputRecoNoFakesNotFromB = std::make_unique<xAOD::TrackParticleContainer>();
104 std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoNoFakesNotFromBAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
105 outputRecoNoFakesNotFromB->setStore(outputRecoNoFakesNotFromBAux.get());
112 if (!recoTrackParticleCol.
isValid()){
114 return StatusCode::FAILURE;
116 if (!pseudoTrackParticleCol.
isValid()){
118 return StatusCode::FAILURE;
127 fillRecoPlusPseudo(recoTrackParticleCol.
cptr(), pseudoTrackParticleCol.
cptr(), outputRecoPlusPseudoNotFromB.get(),
false,
true);
130 fillRecoNoFakes(recoTrackParticleCol.
cptr(), outputRecoNoFakesNotFromB.get(),
false,
true);
133 ATH_MSG_DEBUG(
"outputRecoReplacedWithPseudo has "<<outputRecoReplacedWithPseudo.get()->
size()<<
" tracks");
135 ATH_CHECK(h_write_recoReplacedWithPseudo.
record(std::move(outputRecoReplacedWithPseudo), std::move(outputRecoReplacedWithPseudoAux)));
138 ATH_MSG_DEBUG(
"outputRecoReplacedWithPseudoFromB has "<<outputRecoReplacedWithPseudoFromB.get()->
size()<<
" tracks");
140 ATH_CHECK(h_write_recoReplacedWithPseudoFromB.
record(std::move(outputRecoReplacedWithPseudoFromB), std::move(outputRecoReplacedWithPseudoFromBAux)));
143 ATH_MSG_DEBUG(
"outputRecoReplacedWithPseudoNotFromB has "<<outputRecoReplacedWithPseudoNotFromB.get()->
size()<<
" tracks");
145 ATH_CHECK(h_write_recoReplacedWithPseudoNotFromB.
record(std::move(outputRecoReplacedWithPseudoNotFromB), std::move(outputRecoReplacedWithPseudoNotFromBAux)));
148 ATH_MSG_DEBUG(
"outputRecoPlusPseudo has "<<outputRecoPlusPseudo.get()->
size()<<
" tracks");
150 ATH_CHECK(h_write_recoPlusPseudo.
record(std::move(outputRecoPlusPseudo), std::move(outputRecoPlusPseudoAux)));
153 ATH_MSG_DEBUG(
"outputRecoPlusPseudoFromB has "<<outputRecoPlusPseudoFromB.get()->
size()<<
" tracks");
155 ATH_CHECK(h_write_recoPlusPseudoFromB.
record(std::move(outputRecoPlusPseudoFromB), std::move(outputRecoPlusPseudoFromBAux)));
158 ATH_MSG_DEBUG(
"outputRecoPlusPseudoNotFromB has "<<outputRecoPlusPseudoNotFromB.get()->
size()<<
" tracks");
160 ATH_CHECK(h_write_recoPlusPseudoNotFromB.
record(std::move(outputRecoPlusPseudoNotFromB), std::move(outputRecoPlusPseudoNotFromBAux)));
163 ATH_MSG_DEBUG(
"outputRecoNoFakes has "<<outputRecoNoFakes.get()->
size()<<
" tracks");
165 ATH_CHECK(h_write_recoNoFakes.
record(std::move(outputRecoNoFakes), std::move(outputRecoNoFakesAux)));
168 ATH_MSG_DEBUG(
"outputRecoNoFakesFromB has "<<outputRecoNoFakesFromB.get()->
size()<<
" tracks");
170 ATH_CHECK(h_write_recoNoFakesFromB.
record(std::move(outputRecoNoFakesFromB), std::move(outputRecoNoFakesFromBAux)));
173 ATH_MSG_DEBUG(
"outputRecoNoFakesNotFromB has "<<outputRecoNoFakesNotFromB.get()->
size()<<
" tracks");
175 ATH_CHECK(h_write_recoNoFakesNotFromB.
record(std::move(outputRecoNoFakesNotFromB), std::move(outputRecoNoFakesNotFromBAux)));
178 return StatusCode::SUCCESS;
189 bool onlyNotFromB )
const
191 ATH_MSG_DEBUG(
"Start fillRecoReplacedWithPseudo with onlyFromB = "<<onlyFromB<<
" and onlyNotFromB = "<<onlyNotFromB);
193 if((recoTrackParticleCol && !recoTrackParticleCol->
empty()) &&
194 (pseudoTrackParticleCol && !pseudoTrackParticleCol->
empty())) {
195 ATH_MSG_DEBUG(
"Size of reco track particle collection " << recoTrackParticleCol->
size());
196 ATH_MSG_DEBUG(
"Size of pseudo track particle collection " << pseudoTrackParticleCol->
size());
199 for(
const auto *
const tp_reco: *recoTrackParticleCol){
203 bool match_found =
false;
205 for(
const auto *
const tp_pseudo: *pseudoTrackParticleCol){
207 if (truth_reco == truth_pseudo){
211 if (!onlyFromB && !onlyNotFromB){
260 ATH_MSG_DEBUG(
"reco track that has truth link DOES NOT have truth-matched pseudo track! :(");
267 ATH_MSG_DEBUG(
"Size of output track particle collection " << outputCol->
size() <<
" (sanity: "<<n_saved<<
")");
275 bool onlyNotFromB )
const
277 ATH_MSG_DEBUG(
"Start fillRecoPlusPseudo with onlyFromB = "<<onlyFromB<<
" and onlyNotFromB = "<<onlyNotFromB);
279 if((recoTrackParticleCol && !recoTrackParticleCol->
empty()) &&
280 (pseudoTrackParticleCol && !pseudoTrackParticleCol->
empty())) {
281 ATH_MSG_DEBUG(
"Size of reco track particle collection " << recoTrackParticleCol->
size());
282 ATH_MSG_DEBUG(
"Size of pseudo track particle collection " << pseudoTrackParticleCol->
size());
285 for(
const auto *
const tp_reco: *recoTrackParticleCol){
291 for(
const auto *
const tp_pseudo: *pseudoTrackParticleCol){
292 bool match_found =
false;
294 for(
const auto *
const tp_reco: *recoTrackParticleCol){
298 if (truth_reco == truth_pseudo){
309 ATH_MSG_DEBUG(
"no match found, so adding pseudo track to output");
310 if(!onlyFromB && !onlyNotFromB){
332 ATH_MSG_DEBUG(
"match found so not adding pseudo track to output");
335 ATH_MSG_DEBUG(
"Size of output track particle collection " << outputCol->
size() <<
" (sanity: "<<n_saved<<
")");
342 bool onlyNotFromB )
const
344 ATH_MSG_DEBUG(
"Start fillRecoNoFakes with onlyFromB = "<<onlyFromB<<
" and onlyNotFromB = "<<onlyNotFromB);
346 if((recoTrackParticleCol && !recoTrackParticleCol->
empty())){
347 ATH_MSG_DEBUG(
"Size of reco track particle collection " << recoTrackParticleCol->
size());
352 for(
const auto *
const tp_reco: *recoTrackParticleCol){
354 if (!onlyFromB && !onlyNotFromB){
355 if( acc_truthProb( *tp_reco ) < 0.5) {
363 if( acc_truthProb( *tp_reco ) < 0.5) {
369 if( acc_truthProb( *tp_reco ) < 0.5) {
379 ATH_MSG_DEBUG(
"Size of output track particle collection " << outputCol->
size() <<
" (sanity: "<<n_saved<<
")");
406 linkedTruthParticle = (*link);
407 return linkedTruthParticle;