241 const ValidationInfo &validationInfo,
const bool useInterpretedMatching,
const bool printToScreen,
const bool fillTree)
const
253 for (
auto &entry : foldedTargetMCToHitsMap)
256 mcCRVector.push_back(entry.first);
263 std::stringstream stringStream;
265 for (
const MCParticle *
const pCosmicRay : mcCRVector)
268 if (foldedMCToPfoHitSharingMap.at(pCosmicRay).empty())
272 int nReconstructableChildCRLs(0), nCorrectChildCRLs(0);
276 float mcE_CR(0.f), mcPX_CR(0.f), mcPY_CR(0.f), mcPZ_CR(0.f);
277 int nMCHitsTotal_CR(0), nMCHitsU_CR(0), nMCHitsV_CR(0), nMCHitsW_CR(0);
278 float mcVertexX_CR(0.f), mcVertexY_CR(0.f), mcVertexZ_CR(0.f), mcEndX_CR(0.f), mcEndY_CR(0.f), mcEndZ_CR(0.f);
284 IntVector nMCHitsTotal_CRL, nMCHitsU_CRL, nMCHitsV_CRL, nMCHitsW_CRL;
285 FloatVector mcVertexX_CRL, mcVertexY_CRL, mcVertexZ_CRL, mcEndX_CRL, mcEndY_CRL, mcEndZ_CRL;
286 IntVector nAboveThresholdMatches_CRL, isCorrect_CRL, isCorrectParentLink_CRL;
287 IntVector bestMatchNHitsTotal_CRL, bestMatchNHitsU_CRL, bestMatchNHitsV_CRL, bestMatchNHitsW_CRL;
288 IntVector bestMatchNSharedHitsTotal_CRL, bestMatchNSharedHitsU_CRL, bestMatchNSharedHitsV_CRL, bestMatchNSharedHitsW_CRL;
289 IntVector bestMatchNParentTrackHitsTotal_CRL, bestMatchNParentTrackHitsU_CRL, bestMatchNParentTrackHitsV_CRL, bestMatchNParentTrackHitsW_CRL;
290 IntVector bestMatchNOtherTrackHitsTotal_CRL, bestMatchNOtherTrackHitsU_CRL, bestMatchNOtherTrackHitsV_CRL, bestMatchNOtherTrackHitsW_CRL;
291 IntVector bestMatchNOtherShowerHitsTotal_CRL, bestMatchNOtherShowerHitsU_CRL, bestMatchNOtherShowerHitsV_CRL, bestMatchNOtherShowerHitsW_CRL;
292 IntVector totalCRLHitsInBestMatchParentCR_CRL, uCRLHitsInBestMatchParentCR_CRL, vCRLHitsInBestMatchParentCR_CRL, wCRLHitsInBestMatchParentCR_CRL;
293 FloatVector bestMatchVertexX_CRL, bestMatchVertexY_CRL, bestMatchVertexZ_CRL;
296 IntVector bestMatchOtherShowerHitsID_CRL, bestMatchOtherTrackHitsID_CRL, bestMatchParentTrackHitsID_CRL, bestMatchCRLHitsInCRID_CRL;
297 FloatVector bestMatchOtherShowerHitsDistance_CRL, bestMatchOtherTrackHitsDistance_CRL, bestMatchParentTrackHitsDistance_CRL,
298 bestMatchCRLHitsInCRDistance_CRL;
303 for (
const MCParticle *
const pCosmicRayChild : pCosmicRay->GetDaughterList())
307 int mcIndex((
size_t)(intptr_t *)pCosmicRayChild->GetUid());
320 if (foldedTargetMCToHitsMap.find(pCosmicRayChild) == foldedTargetMCToHitsMap.end())
323 childLeadingParticles.push_back(pCosmicRayChild);
327 if (childLeadingParticles.empty())
338 const CaloHitList &cosmicRayHitList(foldedAllMCToHitsMap.at(pCosmicRay));
344 std::cout <<
"MC COSMIC RAY HITS" << std::endl;
347 const CartesianVector vertex(pCosmicRay->GetVertex()), endpoint(pCosmicRay->GetEndpoint());
348 const float x0(cosmicRayHitList.front()->GetX0());
349 const CartesianVector shiftedVertex(vertex.GetX() - x0, vertex.GetY(), vertex.GetZ());
352 PandoraMonitoringApi::AddMarkerToVisualization(this->
GetPandora(), &shiftedVertex,
"T0 shifted vertex ", BLACK, 2);
353 PandoraMonitoringApi::AddMarkerToVisualization(this->
GetPandora(), &shiftedEndpoint,
"T0 shifted endpoint", BLACK, 2);
354 PandoraMonitoringApi::ViewEvent(this->
GetPandora());
361 mcE_CR = pCosmicRay->GetEnergy();
362 mcPX_CR = pCosmicRay->GetMomentum().GetX();
363 mcPY_CR = pCosmicRay->GetMomentum().GetY();
364 mcPZ_CR = pCosmicRay->GetMomentum().GetZ();
365 mcVertexX_CR = pCosmicRay->GetVertex().GetX();
366 mcVertexY_CR = pCosmicRay->GetVertex().GetY();
367 mcVertexZ_CR = pCosmicRay->GetVertex().GetZ();
368 mcEndX_CR = pCosmicRay->GetEndpoint().GetX();
369 mcEndY_CR = pCosmicRay->GetEndpoint().GetY();
370 mcEndZ_CR = pCosmicRay->GetEndpoint().GetZ();
371 nMCHitsTotal_CR = cosmicRayHitList.size();
376 nReconstructableChildCRLs = childLeadingParticles.size();
378 stringStream <<
"\033[34m"
379 <<
"(Parent CR: " << muonCount <<
") "
381 <<
"Energy " << pCosmicRay->GetEnergy() <<
", Dist. " << (pCosmicRay->GetEndpoint() - pCosmicRay->GetVertex()).GetMagnitude()
385 <<
", nReconstructableCRLs " << nReconstructableChildCRLs << std::endl;
390 for (
const MCParticle *
const pLeadingParticle : childLeadingParticles)
395 const CaloHitList &leadingParticleHitList(foldedAllMCToHitsMap.at(pLeadingParticle));
401 size_t mcIndex((
size_t)(intptr_t *)pLeadingParticle->GetUid());
403 std::cout <<
"mcID: " << mcIndex << std::endl;
404 std::cout <<
"MC DELTA RAY HITS" << std::endl;
406 this->
PrintHits(leadingParticleHitList,
false);
408 const CartesianVector vertex(pLeadingParticle->GetVertex()), endpoint(pLeadingParticle->GetEndpoint());
409 const float x0(leadingParticleHitList.front()->GetX0());
410 const CartesianVector shiftedVertex(vertex.GetX() - x0, vertex.GetY(), vertex.GetZ());
413 PandoraMonitoringApi::AddMarkerToVisualization(this->
GetPandora(), &shiftedVertex,
"T0 shifted vertex", BLACK, 2);
414 PandoraMonitoringApi::AddMarkerToVisualization(this->
GetPandora(), &shiftedEndpoint,
"T0 shifted endpoint", BLACK, 2);
415 PandoraMonitoringApi::ViewEvent(this->
GetPandora());
420 mcE_CRL.push_back(pLeadingParticle->GetEnergy());
421 ID_CRL.push_back(leadingCount);
422 mcPX_CRL.push_back(pLeadingParticle->GetMomentum().GetX());
423 mcPY_CRL.push_back(pLeadingParticle->GetMomentum().GetY());
424 mcPZ_CRL.push_back(pLeadingParticle->GetMomentum().GetZ());
425 mcVertexX_CRL.push_back(pLeadingParticle->GetVertex().GetX());
426 mcVertexY_CRL.push_back(pLeadingParticle->GetVertex().GetY());
427 mcVertexZ_CRL.push_back(pLeadingParticle->GetVertex().GetZ());
428 mcEndX_CRL.push_back(pLeadingParticle->GetEndpoint().GetX());
429 mcEndY_CRL.push_back(pLeadingParticle->GetEndpoint().GetY());
430 mcEndZ_CRL.push_back(pLeadingParticle->GetEndpoint().GetZ());
431 nMCHitsTotal_CRL.push_back(leadingParticleHitList.size());
436 stringStream <<
"\033[33m"
437 <<
"(Child " << (
m_deltaRayMode ?
"DR: " :
"Michel: ") << leadingCount <<
") "
439 <<
"Energy " << pLeadingParticle->GetEnergy() <<
", Dist. "
440 << (pLeadingParticle->GetEndpoint() - pLeadingParticle->GetVertex()).GetMagnitude() <<
", nMCHits "
446 int nMatches(0), nAboveThresholdMatches(0);
447 bool isCorrectParentLink(
false);
454 const CaloHitList &pfoHitList(foldedPfoToHitsMap.at(pMatchedPfo));
455 const CaloHitList &sharedHitList(pfoToSharedHits.second);
456 const bool isGoodMatch(this->
IsGoodMatch(leadingParticleHitList, pfoHitList, sharedHitList));
459 ++nAboveThresholdMatches;
461 CaloHitList parentTrackHits, otherTrackHits, otherShowerHits;
466 bool isMatchedToCorrectCosmicRay(
false);
469 for (LArMCParticleHelper::PfoToSharedHitsVector::const_iterator cosmicRayMatchedPfoPair =
470 foldedMCToPfoHitSharingMap.at(pCosmicRay).begin();
471 cosmicRayMatchedPfoPair != foldedMCToPfoHitSharingMap.at(pCosmicRay).end(); ++cosmicRayMatchedPfoPair)
475 mcParentMatchedPfoHits.insert(mcParentMatchedPfoHits.end(), foldedPfoToHitsMap.at(pCosmicRayPfo).begin(),
476 foldedPfoToHitsMap.at(pCosmicRayPfo).end());
478 if (pCosmicRayPfo == pParentPfo)
479 isMatchedToCorrectCosmicRay =
true;
484 mcParentMatchedPfoHits, leadingParticleHitList, leadingParticleHitsInParentCosmicRay);
486 if ((nAboveThresholdMatches == 1) && isGoodMatch)
488 isCorrectParentLink = isMatchedToCorrectCosmicRay;
490 bestMatchNHitsTotal_CRL.push_back(pfoHitList.size());
495 bestMatchNSharedHitsTotal_CRL.push_back(sharedHitList.size());
500 bestMatchNParentTrackHitsTotal_CRL.push_back(parentTrackHits.size());
505 bestMatchNOtherTrackHitsTotal_CRL.push_back(otherTrackHits.size());
510 bestMatchNOtherShowerHitsTotal_CRL.push_back(otherShowerHits.size());
515 totalCRLHitsInBestMatchParentCR_CRL.push_back(leadingParticleHitsInParentCosmicRay.size());
520 bestMatchOtherShowerHitsID_CRL.insert(bestMatchOtherShowerHitsID_CRL.end(), otherShowerHits.size(), leadingCount);
523 bestMatchOtherTrackHitsID_CRL.insert(bestMatchOtherTrackHitsID_CRL.end(), otherTrackHits.size(), leadingCount);
526 bestMatchParentTrackHitsID_CRL.insert(bestMatchParentTrackHitsID_CRL.end(), parentTrackHits.size(), leadingCount);
529 bestMatchCRLHitsInCRID_CRL.insert(bestMatchCRLHitsInCRID_CRL.end(), leadingParticleHitsInParentCosmicRay.size(), leadingCount);
534 if (deltaRayVertexList.size() > 1)
536 std::cout <<
"ISOBEL: DELTA RAY RECO VERTEX LIST LARGER THAN 1" << std::endl;
540 bestMatchVertexX_CRL.push_back(deltaRayVertexList.empty() ? 1000001 : deltaRayVertexList.front()->GetPosition().GetX());
541 bestMatchVertexY_CRL.push_back(deltaRayVertexList.empty() ? 1000001 : deltaRayVertexList.front()->GetPosition().GetY());
542 bestMatchVertexZ_CRL.push_back(deltaRayVertexList.empty() ? 1000001 : deltaRayVertexList.front()->GetPosition().GetZ());
545 stringStream <<
"-" << (!isGoodMatch ?
"(Below threshold) " :
"") <<
"nPfoHits " << pfoHitList.size() <<
" ("
552 <<
", nCRLHitsInParentCR " << leadingParticleHitsInParentCosmicRay.size() <<
" ("
556 << (!isGoodMatch ?
" " :
" ") <<
"nParentTrackHits " << parentTrackHits.size() <<
" ("
560 <<
", nOtherTrackHits " << otherTrackHits.size() <<
" ("
564 <<
", nOtherShowerHits " << otherShowerHits.size() <<
" ("
568 << (!isGoodMatch ?
" " :
" ") << (isMatchedToCorrectCosmicRay ?
"Correct" :
"Incorrect") <<
"\033[0m"
569 <<
" parent link" << std::endl;
575 std::cout << stringStream.str() << std::endl;
576 std::cout <<
"DELTA RAY PFO HITS" << std::endl;
578 this->
PrintHits(pfoHitList, otherShowerHits, otherTrackHits, parentTrackHits,
"DR_PFO");
580 if (pParentPfo != pMatchedPfo)
582 std::cout <<
"PARENT PFO" << std::endl;
584 const CaloHitList &parentCRHits(foldedPfoToHitsMap.at(pParentPfo));
585 this->
PrintHits(parentCRHits, leadingParticleHitList,
"DR_PARENT_PFO");
590 if (deltaRayVertexList.size() > 1)
592 std::cout <<
"ISOBEL: DELTA RAY RECO VERTEX LIST LARGER THAN 1" << std::endl;
596 if (deltaRayVertexList.empty())
598 std::cout <<
"No reconstructed vertex" << std::endl;
602 const PfoList deltaRayList({pMatchedPfo}), cosmicList({pParentPfo});
603 const CartesianVector &vertex(deltaRayVertexList.front()->GetPosition());
605 PandoraMonitoringApi::VisualizeParticleFlowObjects(this->
GetPandora(), &deltaRayList,
"Delta Ray Pfo", BLACK,
false,
false);
606 PandoraMonitoringApi::VisualizeParticleFlowObjects(this->
GetPandora(), &cosmicList,
"Delta Ray Pfo", RED,
false,
false);
607 PandoraMonitoringApi::AddMarkerToVisualization(this->
GetPandora(), &vertex,
"vertex", RED, 2);
608 PandoraMonitoringApi::ViewEvent(this->
GetPandora());
615 nAboveThresholdMatches_CRL.push_back(nAboveThresholdMatches);
616 isCorrectParentLink_CRL.push_back(isCorrectParentLink ? 1 : 0);
618 const bool isCorrect((nAboveThresholdMatches == 1) && isCorrectParentLink);
623 isCorrect_CRL.push_back(1);
627 isCorrect_CRL.push_back(0);
630 if (foldedMCToPfoHitSharingMap.at(pLeadingParticle).empty())
633 <<
"No matched pfo" << std::endl;
636 std::cout << stringStream.str() << std::endl;
639 if (nAboveThresholdMatches == 0)
641 bestMatchNHitsTotal_CRL.push_back(0);
642 bestMatchNHitsU_CRL.push_back(0);
643 bestMatchNHitsV_CRL.push_back(0);
644 bestMatchNHitsW_CRL.push_back(0);
645 bestMatchNSharedHitsTotal_CRL.push_back(0);
646 bestMatchNSharedHitsU_CRL.push_back(0);
647 bestMatchNSharedHitsV_CRL.push_back(0);
648 bestMatchNSharedHitsW_CRL.push_back(0);
649 bestMatchNParentTrackHitsTotal_CRL.push_back(0);
650 bestMatchNParentTrackHitsU_CRL.push_back(0);
651 bestMatchNParentTrackHitsV_CRL.push_back(0);
652 bestMatchNParentTrackHitsW_CRL.push_back(0);
653 bestMatchNOtherTrackHitsTotal_CRL.push_back(0);
654 bestMatchNOtherTrackHitsU_CRL.push_back(0), bestMatchNOtherTrackHitsV_CRL.push_back(0);
655 bestMatchNOtherTrackHitsW_CRL.push_back(0);
656 bestMatchNOtherShowerHitsTotal_CRL.push_back(0);
657 bestMatchNOtherShowerHitsU_CRL.push_back(0);
658 bestMatchNOtherShowerHitsV_CRL.push_back(0), bestMatchNOtherShowerHitsW_CRL.push_back(0);
659 totalCRLHitsInBestMatchParentCR_CRL.push_back(0);
660 uCRLHitsInBestMatchParentCR_CRL.push_back(0);
661 vCRLHitsInBestMatchParentCR_CRL.push_back(0);
662 wCRLHitsInBestMatchParentCR_CRL.push_back(0);
665 stringStream << nAboveThresholdMatches <<
" above threshold matches" << std::endl
666 <<
"Reconstruction is " << (isCorrect ?
"\033[32m" :
"\033[31m") << (isCorrect ?
"CORRECT" :
"INCORRECT")
667 <<
"\033[0m" << std::endl;
670 std::cout << stringStream.str() << std::endl;
717 SetTreeVariable(this->
GetPandora(),
m_treeName.c_str(),
"bestMatchNSharedHitsTotal_CRL", &bestMatchNSharedHitsTotal_CRL));
722 this->
GetPandora(),
m_treeName.c_str(),
"bestMatchNParentTrackHitsTotal_CRL", &bestMatchNParentTrackHitsTotal_CRL));
724 SetTreeVariable(this->
GetPandora(),
m_treeName.c_str(),
"bestMatchNParentTrackHitsU_CRL", &bestMatchNParentTrackHitsU_CRL));
726 SetTreeVariable(this->
GetPandora(),
m_treeName.c_str(),
"bestMatchNParentTrackHitsV_CRL", &bestMatchNParentTrackHitsV_CRL));
728 SetTreeVariable(this->
GetPandora(),
m_treeName.c_str(),
"bestMatchNParentTrackHitsW_CRL", &bestMatchNParentTrackHitsW_CRL));
730 SetTreeVariable(this->
GetPandora(),
m_treeName.c_str(),
"bestMatchNOtherTrackHitsTotal_CRL", &bestMatchNOtherTrackHitsTotal_CRL));
732 SetTreeVariable(this->
GetPandora(),
m_treeName.c_str(),
"bestMatchNOtherTrackHitsU_CRL", &bestMatchNOtherTrackHitsU_CRL));
734 SetTreeVariable(this->
GetPandora(),
m_treeName.c_str(),
"bestMatchNOtherTrackHitsV_CRL", &bestMatchNOtherTrackHitsV_CRL));
736 SetTreeVariable(this->
GetPandora(),
m_treeName.c_str(),
"bestMatchNOtherTrackHitsW_CRL", &bestMatchNOtherTrackHitsW_CRL));
738 this->
GetPandora(),
m_treeName.c_str(),
"bestMatchNOtherShowerHitsTotal_CRL", &bestMatchNOtherShowerHitsTotal_CRL));
740 SetTreeVariable(this->
GetPandora(),
m_treeName.c_str(),
"bestMatchNOtherShowerHitsU_CRL", &bestMatchNOtherShowerHitsU_CRL));
742 SetTreeVariable(this->
GetPandora(),
m_treeName.c_str(),
"bestMatchNOtherShowerHitsV_CRL", &bestMatchNOtherShowerHitsV_CRL));
744 SetTreeVariable(this->
GetPandora(),
m_treeName.c_str(),
"bestMatchNOtherShowerHitsW_CRL", &bestMatchNOtherShowerHitsW_CRL));
746 this->
GetPandora(),
m_treeName.c_str(),
"totalCRLHitsInBestMatchParentCR_CRL", &totalCRLHitsInBestMatchParentCR_CRL));
748 SetTreeVariable(this->
GetPandora(),
m_treeName.c_str(),
"uCRLHitsInBestMatchParentCR_CRL", &uCRLHitsInBestMatchParentCR_CRL));
750 SetTreeVariable(this->
GetPandora(),
m_treeName.c_str(),
"vCRLHitsInBestMatchParentCR_CRL", &vCRLHitsInBestMatchParentCR_CRL));
752 SetTreeVariable(this->
GetPandora(),
m_treeName.c_str(),
"wCRLHitsInBestMatchParentCR_CRL", &wCRLHitsInBestMatchParentCR_CRL));
755 SetTreeVariable(this->
GetPandora(),
m_treeName.c_str(),
"bestMatchOtherShowerHitsID_CRL", &bestMatchOtherShowerHitsID_CRL));
757 this->
GetPandora(),
m_treeName.c_str(),
"bestMatchOtherShowerHitsDistance_CRL", &bestMatchOtherShowerHitsDistance_CRL));
759 SetTreeVariable(this->
GetPandora(),
m_treeName.c_str(),
"bestMatchOtherTrackHitsID_CRL", &bestMatchOtherTrackHitsID_CRL));
761 this->
GetPandora(),
m_treeName.c_str(),
"bestMatchOtherTrackHitsDistance_CRL", &bestMatchOtherTrackHitsDistance_CRL));
763 SetTreeVariable(this->
GetPandora(),
m_treeName.c_str(),
"bestMatchParentTrackHitsID_CRL", &bestMatchParentTrackHitsID_CRL));
765 this->
GetPandora(),
m_treeName.c_str(),
"bestMatchParentTrackHitsDistance_CRL", &bestMatchParentTrackHitsDistance_CRL));
768 SetTreeVariable(this->
GetPandora(),
m_treeName.c_str(),
"bestMatchCRLHitsInCRDistance_CRL", &bestMatchCRLHitsInCRDistance_CRL));
773 stringStream <<
"------------------------------------------------------------------------------------------------" << std::endl;
774 stringStream << nCorrectChildCRLs <<
" / " << nReconstructableChildCRLs <<
" CRLs correctly reconstructed" << std::endl;
775 stringStream <<
"------------------------------------------------------------------------------------------------" << std::endl;
776 stringStream <<
"------------------------------------------------------------------------------------------------" << std::endl;
779 if (printToScreen && !(
m_visualize && useInterpretedMatching))
781 std::cout << stringStream.str() << std::endl;