416 if (
m_printDebug) std::cout <<
" *** PFParticleMonitoring::analyze(...) *** " << std::endl;
494 std::cout <<
" Run: " <<
m_run << std::endl;
495 std::cout <<
" Event: " <<
m_event << std::endl;
503 if (
m_printDebug) std::cout <<
" Hits: " << hitVector.size() << std::endl;
511 evt,
m_particleLabel, spacePointVector, spacePointsToHits, hitsToSpacePoints);
513 if (
m_printDebug) std::cout <<
" SpacePoints: " << spacePointVector.size() << std::endl;
521 if (
m_printDebug) std::cout <<
" Tracks: " << recoTrackVector.size() << std::endl;
536 if (
m_printDebug) std::cout <<
" Vertices: " << recoVertexVector.size() << std::endl;
557 std::cout <<
" RecoNeutrinos: " << recoNeutrinoVector.size() << std::endl;
558 std::cout <<
" RecoParticles: " << recoParticleVector.size() << std::endl;
584 if (trueHitsToParticles.empty()) {
586 throw cet::exception(
"LArPandora") <<
" PFParticleMonitoring::analyze - no sim channels "
587 "found, backtracker module must be set in FHiCL "
604 std::cout <<
" TrueParticles: " << particlesToTruth.size() << std::endl;
605 std::cout <<
" TrueEvents: " << truthToParticles.size() << std::endl;
606 std::cout <<
" MatchedParticles: " << trueParticlesToHits.size() << std::endl;
609 if (trueParticlesToHits.empty()) {
628 for (PFParticleVector::const_iterator iter = recoParticleVector.begin(),
629 iterEnd = recoParticleVector.end();
632 const art::Ptr<recob::PFParticle> recoParticle = *iter;
650 recoParticleMap, recoParticlesToHits, recoNeutrinosToHits, recoHitsToNeutrinos);
652 truthToParticles, trueParticlesToHits, trueNeutrinosToHits, trueHitsToNeutrinos);
657 recoNeutrinosToHits, trueHitsToNeutrinos, matchedNeutrinos, matchedNeutrinoHits);
659 for (MCTruthToHits::const_iterator iter = trueNeutrinosToHits.begin(),
660 iterEnd = trueNeutrinosToHits.end();
663 const art::Ptr<simb::MCTruth> trueEvent = iter->first;
664 const HitVector& trueHitVector = iter->second;
666 if (trueHitVector.empty())
continue;
668 if (!trueEvent->NeutrinoSet())
continue;
670 const simb::MCNeutrino trueNeutrino(trueEvent->GetNeutrino());
671 const simb::MCParticle trueParticle(trueNeutrino.Nu());
673 m_mcIsCC = ((simb::kCC == trueNeutrino.CCNC()) ? 1 : 0);
674 m_mcPdg = trueParticle.PdgCode();
689 m_mcDirX = trueParticle.Px() / trueParticle.P();
690 m_mcDirY = trueParticle.Py() / trueParticle.P();
691 m_mcDirZ = trueParticle.Pz() / trueParticle.P();
741 for (HitVector::const_iterator hIter1 = trueHitVector.begin(),
742 hIterEnd1 = trueHitVector.end();
745 if (recoHitsToNeutrinos.find(*hIter1) == recoHitsToNeutrinos.end())
749 MCTruthToPFParticles::const_iterator pIter1 = matchedNeutrinos.find(trueEvent);
750 if (matchedNeutrinos.end() != pIter1) {
751 const art::Ptr<recob::PFParticle> recoParticle = pIter1->second;
760 std::cout <<
" Warning: Found neutrino with an invalid PDG code " << std::endl;
762 PFParticlesToHits::const_iterator pIter2 = recoNeutrinosToHits.find(recoParticle);
763 if (recoParticlesToHits.end() != pIter2) {
764 const HitVector& recoHitVector = pIter2->second;
766 for (HitVector::const_iterator hIter2 = recoHitVector.begin(),
767 hIterEnd2 = recoHitVector.end();
770 if (trueHitsToNeutrinos.find(*hIter2) == trueHitsToNeutrinos.end())
774 MCTruthToHits::const_iterator pIter3 = matchedNeutrinoHits.find(trueEvent);
775 if (matchedNeutrinoHits.end() != pIter3) {
776 const HitVector& matchedHitVector = pIter3->second;
788 PFParticlesToVertices::const_iterator pIter4 =
789 recoParticlesToVertices.find(recoParticle);
790 if (recoParticlesToVertices.end() != pIter4) {
792 if (!vertexVector.empty()) {
794 std::cout <<
" Warning: Found particle with more than one associated vertex "
797 const art::Ptr<recob::Vertex> recoVertex = *(vertexVector.begin());
798 double xyz[3] = {0.0, 0.0, 0.0};
799 recoVertex->XYZ(xyz);
819 std::cout <<
" MCNeutrino [" <<
m_index <<
"]"
835 recoParticlesToHits, trueHitsToParticles, matchedParticles, matchedParticleHits);
838 for (MCParticlesToHits::const_iterator iter = trueParticlesToHits.begin(),
839 iterEnd = trueParticlesToHits.end();
842 const art::Ptr<simb::MCParticle> trueParticle = iter->first;
843 const HitVector& trueHitVector = iter->second;
845 if (trueHitVector.empty())
continue;
847 m_mcPdg = trueParticle->PdgCode();
923 m_mcVtxX = trueParticle->Vx(startT);
924 m_mcVtxY = trueParticle->Vy(startT);
925 m_mcVtxZ = trueParticle->Vz(startT);
938 const double Ptot(trueParticle->P(startT));
941 m_mcDirX = trueParticle->Px(startT) / Ptot;
942 m_mcDirY = trueParticle->Py(startT) / Ptot;
943 m_mcDirZ = trueParticle->Pz(startT) / Ptot;
947 catch (cet::exception& e) {
951 MCParticlesToMCTruth::const_iterator nuIter = particlesToTruth.find(trueParticle);
952 if (particlesToTruth.end() == nuIter)
953 throw cet::exception(
"LArPandora") <<
" PFParticleMonitoring::analyze --- Found a true "
954 "particle without any ancestry information ";
956 const art::Ptr<simb::MCTruth> trueEvent = nuIter->second;
958 if (trueEvent->NeutrinoSet()) {
959 const simb::MCNeutrino neutrino(trueEvent->GetNeutrino());
961 m_mcIsCC = ((simb::kCC == neutrino.CCNC()) ? 1 : 0);
966 const art::Ptr<simb::MCParticle> parentParticle(
968 const art::Ptr<simb::MCParticle> primaryParticle(
970 m_mcParentPdg = ((parentParticle != trueParticle) ? parentParticle->PdgCode() : 0);
973 m_mcIsDecay = (
"Decay" == trueParticle->Process());
975 catch (cet::exception& e) {
979 bool foundSpacePoints(
false);
981 for (HitVector::const_iterator hIter1 = trueHitVector.begin(),
982 hIterEnd1 = trueHitVector.end();
985 const art::Ptr<recob::Hit> hit = *hIter1;
987 HitsToSpacePoints::const_iterator hIter2 = hitsToSpacePoints.find(hit);
988 if (hitsToSpacePoints.end() == hIter2)
continue;
990 const art::Ptr<recob::SpacePoint> spacepoint = hIter2->second;
991 const double X(spacepoint->XYZ()[0]);
993 if (!foundSpacePoints) {
996 foundSpacePoints =
true;
1005 for (HitVector::const_iterator hIter1 = trueHitVector.begin(),
1006 hIterEnd1 = trueHitVector.end();
1007 hIter1 != hIterEnd1;
1009 if (recoHitsToParticles.find(*hIter1) == recoHitsToParticles.end())
1019 MCParticlesToPFParticles::const_iterator pIter1 = matchedParticles.find(trueParticle);
1020 if (matchedParticles.end() != pIter1) {
1021 const art::Ptr<recob::PFParticle> recoParticle = pIter1->second;
1022 m_pfoPdg = recoParticle->PdgCode();
1026 const art::Ptr<recob::PFParticle> parentParticle =
1030 const art::Ptr<recob::PFParticle> primaryParticle =
1034 PFParticlesToHits::const_iterator pIter2 = recoParticlesToHits.find(recoParticle);
1035 if (recoParticlesToHits.end() == pIter2)
1036 throw cet::exception(
"LArPandora")
1037 <<
" PFParticleMonitoring::analyze --- Found a reco particle without any hits ";
1039 const HitVector& recoHitVector = pIter2->second;
1041 for (HitVector::const_iterator hIter2 = recoHitVector.begin(),
1042 hIterEnd2 = recoHitVector.end();
1043 hIter2 != hIterEnd2;
1045 if (trueHitsToParticles.find(*hIter2) == trueHitsToParticles.end())
1049 MCParticlesToHits::const_iterator pIter3 = matchedParticleHits.find(trueParticle);
1050 if (matchedParticleHits.end() == pIter3)
1051 throw cet::exception(
"LArPandora") <<
" PFParticleMonitoring::analyze --- Found a "
1052 "matched true particle without matched hits ";
1054 const HitVector& matchedHitVector = pIter3->second;
1066 PFParticlesToVertices::const_iterator pIter4 = recoParticlesToVertices.find(recoParticle);
1067 if (recoParticlesToVertices.end() != pIter4) {
1069 if (!vertexVector.empty()) {
1071 std::cout <<
" Warning: Found particle with more than one associated vertex "
1074 const art::Ptr<recob::Vertex> recoVertex = *(vertexVector.begin());
1075 double xyz[3] = {0.0, 0.0, 0.0};
1076 recoVertex->XYZ(xyz);
1085 PFParticlesToTracks::const_iterator pIter5 = recoParticlesToTracks.find(recoParticle);
1086 if (recoParticlesToTracks.end() != pIter5) {
1088 if (!trackVector.empty()) {
1090 std::cout <<
" Warning: Found particle with more than one associated track "
1093 const art::Ptr<recob::Track> recoTrack = *(trackVector.begin());
1094 const auto& vtxPosition = recoTrack->Vertex();
1095 const auto& endPosition = recoTrack->End();
1096 const auto& vtxDirection = recoTrack->VertexDirection();
1113 m_pfoIsStitched = (particlesToT0s.end() != particlesToT0s.find(recoParticle));
1124 std::cout <<
" MCParticle [" <<
m_index <<
"]"
1229 bool foundMatches(
false);
1231 for (PFParticlesToHits::const_iterator iter1 = recoNeutrinosToHits.begin(),
1232 iterEnd1 = recoNeutrinosToHits.end();
1235 const art::Ptr<recob::PFParticle> recoNeutrino = iter1->first;
1236 if (vetoReco.count(recoNeutrino) > 0)
continue;
1238 const HitVector& hitVector = iter1->second;
1242 for (HitVector::const_iterator iter2 = hitVector.begin(), iterEnd2 = hitVector.end();
1245 const art::Ptr<recob::Hit> hit = *iter2;
1247 HitsToMCTruth::const_iterator iter3 = trueHitsToNeutrinos.find(hit);
1248 if (trueHitsToNeutrinos.end() == iter3)
continue;
1250 const art::Ptr<simb::MCTruth> trueNeutrino = iter3->second;
1251 if (vetoTrue.count(trueNeutrino) > 0)
continue;
1253 truthContributionMap[trueNeutrino].push_back(hit);
1256 MCTruthToHits::const_iterator mIter = truthContributionMap.end();
1258 for (MCTruthToHits::const_iterator iter4 = truthContributionMap.begin(),
1259 iterEnd4 = truthContributionMap.end();
1262 if ((truthContributionMap.end() == mIter) ||
1263 (iter4->second.size() > mIter->second.size())) {
1268 if (truthContributionMap.end() != mIter) {
1269 const art::Ptr<simb::MCTruth> trueNeutrino = mIter->first;
1271 MCTruthToHits::const_iterator iter5 = matchedNeutrinoHits.find(trueNeutrino);
1273 if ((matchedNeutrinoHits.end() == iter5) || (mIter->second.size() > iter5->second.size())) {
1274 matchedNeutrinos[trueNeutrino] = recoNeutrino;
1275 matchedNeutrinoHits[trueNeutrino] = mIter->second;
1276 foundMatches =
true;
1281 if (!foundMatches)
return;
1283 for (MCTruthToPFParticles::const_iterator pIter = matchedNeutrinos.begin(),
1284 pIterEnd = matchedNeutrinos.end();
1287 vetoTrue.insert(pIter->first);
1288 vetoReco.insert(pIter->second);
1293 trueHitsToNeutrinos,
1295 matchedNeutrinoHits,
1323 bool foundMatches(
false);
1325 for (PFParticlesToHits::const_iterator iter1 = recoParticlesToHits.begin(),
1326 iterEnd1 = recoParticlesToHits.end();
1329 const art::Ptr<recob::PFParticle> recoParticle = iter1->first;
1330 if (vetoReco.count(recoParticle) > 0)
continue;
1332 const HitVector& hitVector = iter1->second;
1336 for (HitVector::const_iterator iter2 = hitVector.begin(), iterEnd2 = hitVector.end();
1339 const art::Ptr<recob::Hit> hit = *iter2;
1341 HitsToMCParticles::const_iterator iter3 = trueHitsToParticles.find(hit);
1342 if (trueHitsToParticles.end() == iter3)
continue;
1344 const art::Ptr<simb::MCParticle> trueParticle = iter3->second;
1345 if (vetoTrue.count(trueParticle) > 0)
continue;
1347 truthContributionMap[trueParticle].push_back(hit);
1350 MCParticlesToHits::const_iterator mIter = truthContributionMap.end();
1352 for (MCParticlesToHits::const_iterator iter4 = truthContributionMap.begin(),
1353 iterEnd4 = truthContributionMap.end();
1356 if ((truthContributionMap.end() == mIter) ||
1357 (iter4->second.size() > mIter->second.size())) {
1362 if (truthContributionMap.end() != mIter) {
1363 const art::Ptr<simb::MCParticle> trueParticle = mIter->first;
1365 MCParticlesToHits::const_iterator iter5 = matchedHits.find(trueParticle);
1367 if ((matchedHits.end() == iter5) || (mIter->second.size() > iter5->second.size())) {
1368 matchedParticles[trueParticle] = recoParticle;
1369 matchedHits[trueParticle] = mIter->second;
1370 foundMatches =
true;
1375 if (!foundMatches)
return;
1377 for (MCParticlesToPFParticles::const_iterator pIter = matchedParticles.begin(),
1378 pIterEnd = matchedParticles.end();
1381 vetoTrue.insert(pIter->first);
1382 vetoReco.insert(pIter->second);
1387 trueHitsToParticles,