17 #include "GaudiKernel/MsgStream.h" 
   29                                            const IInterface* 
p) : base_class(
t,
n,
p)
 
   64     return StatusCode::SUCCESS;
 
   73     return StatusCode::SUCCESS;
 
   78     std::unique_ptr<xAOD::TrackParticleContainer> outputRecoReplacedWithPseudo = std::make_unique<xAOD::TrackParticleContainer>();
 
   79     std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoReplacedWithPseudoAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
 
   80     outputRecoReplacedWithPseudo->setStore(outputRecoReplacedWithPseudoAux.get());
 
   81     std::unique_ptr<xAOD::TrackParticleContainer> outputRecoReplacedWithPseudoFromB = std::make_unique<xAOD::TrackParticleContainer>();
 
   82     std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoReplacedWithPseudoFromBAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
 
   83     outputRecoReplacedWithPseudoFromB->setStore(outputRecoReplacedWithPseudoFromBAux.get());
 
   84     std::unique_ptr<xAOD::TrackParticleContainer> outputRecoReplacedWithPseudoNotFromB = std::make_unique<xAOD::TrackParticleContainer>();
 
   85     std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoReplacedWithPseudoNotFromBAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
 
   86     outputRecoReplacedWithPseudoNotFromB->setStore(outputRecoReplacedWithPseudoNotFromBAux.get());
 
   87     std::unique_ptr<xAOD::TrackParticleContainer> outputRecoPlusPseudo = std::make_unique<xAOD::TrackParticleContainer>();
 
   88     std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoPlusPseudoAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
 
   89     outputRecoPlusPseudo->setStore(outputRecoPlusPseudoAux.get());
 
   90     std::unique_ptr<xAOD::TrackParticleContainer> outputRecoPlusPseudoFromB = std::make_unique<xAOD::TrackParticleContainer>();
 
   91     std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoPlusPseudoFromBAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
 
   92     outputRecoPlusPseudoFromB->setStore(outputRecoPlusPseudoFromBAux.get());
 
   93     std::unique_ptr<xAOD::TrackParticleContainer> outputRecoPlusPseudoNotFromB = std::make_unique<xAOD::TrackParticleContainer>();
 
   94     std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoPlusPseudoNotFromBAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
 
   95     outputRecoPlusPseudoNotFromB->setStore(outputRecoPlusPseudoNotFromBAux.get());
 
   96     std::unique_ptr<xAOD::TrackParticleContainer> outputRecoNoFakes = std::make_unique<xAOD::TrackParticleContainer>();
 
   97     std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoNoFakesAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
 
   98     outputRecoNoFakes->setStore(outputRecoNoFakesAux.get());
 
   99     std::unique_ptr<xAOD::TrackParticleContainer> outputRecoNoFakesFromB = std::make_unique<xAOD::TrackParticleContainer>();
 
  100     std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoNoFakesFromBAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
 
  101     outputRecoNoFakesFromB->setStore(outputRecoNoFakesFromBAux.get());
 
  102     std::unique_ptr<xAOD::TrackParticleContainer> outputRecoNoFakesNotFromB = std::make_unique<xAOD::TrackParticleContainer>();
 
  103     std::unique_ptr<xAOD::TrackParticleAuxContainer> outputRecoNoFakesNotFromBAux = std::make_unique<xAOD::TrackParticleAuxContainer>();
 
  104     outputRecoNoFakesNotFromB->setStore(outputRecoNoFakesNotFromBAux.get());
 
  111     if (!recoTrackParticleCol.
isValid()){
 
  113       return StatusCode::FAILURE;
 
  115     if (!pseudoTrackParticleCol.
isValid()){
 
  117       return StatusCode::FAILURE;
 
  126     fillRecoPlusPseudo(recoTrackParticleCol.
cptr(), pseudoTrackParticleCol.
cptr(), outputRecoPlusPseudoNotFromB.get(), 
false, 
true);
 
  129     fillRecoNoFakes(recoTrackParticleCol.
cptr(), outputRecoNoFakesNotFromB.get(), 
false, 
true);
 
  132     ATH_MSG_DEBUG(
"outputRecoReplacedWithPseudo has "<<outputRecoReplacedWithPseudo.get()->
size()<<
" tracks");
 
  134     ATH_CHECK(h_write_recoReplacedWithPseudo.
record(std::move(outputRecoReplacedWithPseudo), std::move(outputRecoReplacedWithPseudoAux)));
 
  137     ATH_MSG_DEBUG(
"outputRecoReplacedWithPseudoFromB has "<<outputRecoReplacedWithPseudoFromB.get()->
size()<<
" tracks");
 
  139     ATH_CHECK(h_write_recoReplacedWithPseudoFromB.
record(std::move(outputRecoReplacedWithPseudoFromB), std::move(outputRecoReplacedWithPseudoFromBAux)));
 
  142     ATH_MSG_DEBUG(
"outputRecoReplacedWithPseudoNotFromB has "<<outputRecoReplacedWithPseudoNotFromB.get()->
size()<<
" tracks");
 
  144     ATH_CHECK(h_write_recoReplacedWithPseudoNotFromB.
record(std::move(outputRecoReplacedWithPseudoNotFromB), std::move(outputRecoReplacedWithPseudoNotFromBAux)));
 
  147     ATH_MSG_DEBUG(
"outputRecoPlusPseudo has "<<outputRecoPlusPseudo.get()->
size()<<
" tracks");
 
  149     ATH_CHECK(h_write_recoPlusPseudo.
record(std::move(outputRecoPlusPseudo), std::move(outputRecoPlusPseudoAux)));
 
  152     ATH_MSG_DEBUG(
"outputRecoPlusPseudoFromB has "<<outputRecoPlusPseudoFromB.get()->
size()<<
" tracks");
 
  154     ATH_CHECK(h_write_recoPlusPseudoFromB.
record(std::move(outputRecoPlusPseudoFromB), std::move(outputRecoPlusPseudoFromBAux)));
 
  157     ATH_MSG_DEBUG(
"outputRecoPlusPseudoNotFromB has "<<outputRecoPlusPseudoNotFromB.get()->
size()<<
" tracks");
 
  159     ATH_CHECK(h_write_recoPlusPseudoNotFromB.
record(std::move(outputRecoPlusPseudoNotFromB), std::move(outputRecoPlusPseudoNotFromBAux)));
 
  162     ATH_MSG_DEBUG(
"outputRecoNoFakes has "<<outputRecoNoFakes.get()->
size()<<
" tracks");
 
  164     ATH_CHECK(h_write_recoNoFakes.
record(std::move(outputRecoNoFakes), std::move(outputRecoNoFakesAux)));
 
  167     ATH_MSG_DEBUG(
"outputRecoNoFakesFromB has "<<outputRecoNoFakesFromB.get()->
size()<<
" tracks");
 
  169     ATH_CHECK(h_write_recoNoFakesFromB.
record(std::move(outputRecoNoFakesFromB), std::move(outputRecoNoFakesFromBAux)));
 
  172     ATH_MSG_DEBUG(
"outputRecoNoFakesNotFromB has "<<outputRecoNoFakesNotFromB.get()->
size()<<
" tracks");
 
  174     ATH_CHECK(h_write_recoNoFakesNotFromB.
record(std::move(outputRecoNoFakesNotFromB), std::move(outputRecoNoFakesNotFromBAux)));
 
  177     return StatusCode::SUCCESS;
 
  188                                                        bool onlyNotFromB )
 const 
  190     ATH_MSG_DEBUG(
"Start fillRecoReplacedWithPseudo with onlyFromB = "<<onlyFromB<<
" and onlyNotFromB = "<<onlyNotFromB);
 
  192     if((recoTrackParticleCol && !recoTrackParticleCol->
empty()) &&
 
  193        (pseudoTrackParticleCol && !pseudoTrackParticleCol->
empty())) {
 
  194       ATH_MSG_DEBUG(
"Size of reco track particle collection " << recoTrackParticleCol->
size());
 
  195       ATH_MSG_DEBUG(
"Size of pseudo track particle collection " << pseudoTrackParticleCol->
size());
 
  198       for(
const auto *
const tp_reco: *recoTrackParticleCol){
 
  202           bool match_found = 
false;
 
  204           for(
const auto *
const tp_pseudo: *pseudoTrackParticleCol){
 
  206             if (truth_reco == truth_pseudo){
 
  210               if (!onlyFromB && !onlyNotFromB){
 
  259             ATH_MSG_DEBUG(
"reco track that has truth link DOES NOT have truth-matched pseudo track! :(");
 
  266       ATH_MSG_DEBUG(
"Size of output track particle collection " << outputCol->
size() <<
" (sanity: "<<n_saved<<
")");
 
  274                                                bool onlyNotFromB )
 const 
  276     ATH_MSG_DEBUG(
"Start fillRecoPlusPseudo with onlyFromB = "<<onlyFromB<<
" and onlyNotFromB = "<<onlyNotFromB);
 
  278     if((recoTrackParticleCol && !recoTrackParticleCol->
empty()) &&
 
  279        (pseudoTrackParticleCol && !pseudoTrackParticleCol->
empty())) {
 
  280       ATH_MSG_DEBUG(
"Size of reco track particle collection " << recoTrackParticleCol->
size());
 
  281       ATH_MSG_DEBUG(
"Size of pseudo track particle collection " << pseudoTrackParticleCol->
size());
 
  284       for(
const auto *
const tp_reco: *recoTrackParticleCol){
 
  290       for(
const auto *
const tp_pseudo: *pseudoTrackParticleCol){
 
  291         bool match_found = 
false;
 
  293         for(
const auto *
const tp_reco: *recoTrackParticleCol){
 
  297             if (truth_reco == truth_pseudo){
 
  308           ATH_MSG_DEBUG(
"no match found, so adding pseudo track to output");
 
  309           if(!onlyFromB && !onlyNotFromB){
 
  331           ATH_MSG_DEBUG(
"match found so not adding pseudo track to output");
 
  334       ATH_MSG_DEBUG(
"Size of output track particle collection " << outputCol->
size() <<
" (sanity: "<<n_saved<<
")");
 
  341                                             bool onlyNotFromB )
 const 
  343     ATH_MSG_DEBUG(
"Start fillRecoNoFakes with onlyFromB = "<<onlyFromB<<
" and onlyNotFromB = "<<onlyNotFromB);
 
  345     if((recoTrackParticleCol && !recoTrackParticleCol->
empty())){
 
  346       ATH_MSG_DEBUG(
"Size of reco track particle collection " << recoTrackParticleCol->
size());
 
  351       for(
const auto *
const tp_reco: *recoTrackParticleCol){
 
  353         if (!onlyFromB && !onlyNotFromB){
 
  354           if( acc_truthProb( *tp_reco ) < 0.5) {
 
  362           if( acc_truthProb( *tp_reco ) < 0.5) {
 
  368           if( acc_truthProb( *tp_reco ) < 0.5) {
 
  378       ATH_MSG_DEBUG(
"Size of output track particle collection " << outputCol->
size() <<
" (sanity: "<<n_saved<<
")");
 
  405     linkedTruthParticle = (*link);
 
  406     return linkedTruthParticle;