9 #include "Pandora/AlgorithmHeaders.h"
25 MuonLeadingEventValidationAlgorithm::MuonLeadingEventValidationAlgorithm() :
26 m_removeRecoCosmicRayHits(
false),
27 m_deltaRayMode(
false),
29 m_cosmicRaysToSkip(0),
31 m_ignoreIncorrectCosmicRays(
false),
32 m_writeRawMatchesToTree(
false)
45 const CaloHitList *
const pCaloHitList,
const PfoList *
const pPfoList,
ValidationInfo &validationInfo)
const
48 throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
53 PandoraMonitoringApi::SetEveDisplayParameters(this->GetPandora(),
true, DETECTOR_VIEW_DEFAULT, -1.f, 1.f, 1.f);
57 CaloHitList recoCosmicRayHitList;
71 const CaloHitList *
const pCaloHitList,
const PfoList *
const pPfoList, CaloHitList &recoCosmicRayHitList)
const
73 recoCosmicRayHitList.clear();
76 this->
PerformUnfoldedMatching(pMCParticleList, pCaloHitList, pPfoList, recoCosmicRayHitList, 0.f, validationInfo);
82 for (
auto &entry : allMCToHitsMap)
87 const MCParticle *
const pCosmicRay(entry.first);
89 for (LArMCParticleHelper::PfoToSharedHitsVector::const_iterator cosmicRayMatchedPfoPair = interpretedMatchingMap.at(pCosmicRay).begin();
90 cosmicRayMatchedPfoPair != interpretedMatchingMap.at(pCosmicRay).end(); ++cosmicRayMatchedPfoPair)
92 const ParticleFlowObject *
const pCosmicRayPfo(cosmicRayMatchedPfoPair->first);
93 recoCosmicRayHitList.insert(recoCosmicRayHitList.end(), pfoToHitsMap.at(pCosmicRayPfo).begin(), pfoToHitsMap.at(pCosmicRayPfo).end());
101 const PfoList *
const pPfoList,
const CaloHitList &recoCosmicRayHitList,
const float minHitSharingFraction,
ValidationInfo &validationInfo)
const
103 if (pMCParticleList && pCaloHitList)
110 pMCParticleList, pCaloHitList, validationParams, recoCosmicRayHitList, targetMCParticleToHitsMap);
119 pMCParticleList, pCaloHitList, allValidationParams, recoCosmicRayHitList, allMCParticleToHitsMap);
150 const CaloHitList *
const pCaloHitList,
const PfoList *
const pPfoList,
ValidationInfo &validationInfo)
const
152 MCParticleList incorrectlyReconstructedCosmicRays;
160 for (
const MCParticle *
const pIncorrectCosmicRay : incorrectlyReconstructedCosmicRays)
162 auto allIter(allMCToHitsMap.find(pIncorrectCosmicRay));
164 if (allIter != allMCToHitsMap.end())
165 allMCToHitsMap.erase(allIter);
167 auto targetIter(targetMCToHitsMap.find(pIncorrectCosmicRay));
169 if (targetIter != targetMCToHitsMap.end())
170 targetMCToHitsMap.erase(targetIter);
172 auto matchingIter(matchingMap.find(pIncorrectCosmicRay));
174 if (matchingIter != matchingMap.end())
175 matchingMap.erase(matchingIter);
177 auto interpretedMatchingIter(interpretedMatchingMap.find(pIncorrectCosmicRay));
179 if (interpretedMatchingIter != interpretedMatchingMap.end())
180 interpretedMatchingMap.erase(interpretedMatchingIter);
192 const CaloHitList *
const pCaloHitList,
const PfoList *
const pPfoList, MCParticleList &incorrectlyReconstructedCosmicRays)
const
195 CaloHitList recoCosmicRayHitList;
197 this->
PerformUnfoldedMatching(pMCParticleList, pCaloHitList, pPfoList, recoCosmicRayHitList, 0.f, validationInfo);
208 for (
const MCParticle *
const pTargetCosmicRay : targetCosmicRayVector)
213 if (interpretedMatchingMap.at(pTargetCosmicRay).empty())
215 incorrectlyReconstructedCosmicRays.push_back(pTargetCosmicRay);
219 const CaloHitList &mcHitList(allMCToHitsMap.at(pTargetCosmicRay));
221 unsigned int nAboveThresholdMatches(0);
224 const CaloHitList &sharedHitList(pfoToSharedHits.second);
225 const CaloHitList &pfoHitList(pfoToHitsMap.at(pfoToSharedHits.first));
227 const bool isGoodMatch(this->
IsGoodMatch(mcHitList, pfoHitList, sharedHitList));
230 ++nAboveThresholdMatches;
233 if (nAboveThresholdMatches != 1)
234 incorrectlyReconstructedCosmicRays.push_back(pTargetCosmicRay);
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);
282 FloatVector mcE_CRL, mcPX_CRL, mcPY_CRL, mcPZ_CRL;
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());
350 const CartesianVector shiftedEndpoint(endpoint.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());
411 const CartesianVector shiftedEndpoint(endpoint.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);
453 const ParticleFlowObject *
const pMatchedPfo(pfoToSharedHits.first);
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;
465 CaloHitList mcParentMatchedPfoHits;
466 bool isMatchedToCorrectCosmicRay(
false);
469 for (LArMCParticleHelper::PfoToSharedHitsVector::const_iterator cosmicRayMatchedPfoPair =
470 foldedMCToPfoHitSharingMap.at(pCosmicRay).begin();
471 cosmicRayMatchedPfoPair != foldedMCToPfoHitSharingMap.at(pCosmicRay).end(); ++cosmicRayMatchedPfoPair)
473 const ParticleFlowObject *
const pCosmicRayPfo(cosmicRayMatchedPfoPair->first);
475 mcParentMatchedPfoHits.insert(mcParentMatchedPfoHits.end(), foldedPfoToHitsMap.at(pCosmicRayPfo).begin(),
476 foldedPfoToHitsMap.at(pCosmicRayPfo).end());
478 if (pCosmicRayPfo == pParentPfo)
479 isMatchedToCorrectCosmicRay =
true;
482 CaloHitList leadingParticleHitsInParentCosmicRay;
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);
532 const VertexList &deltaRayVertexList(pMatchedPfo->GetVertexList());
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)
584 const CaloHitList &parentCRHits(foldedPfoToHitsMap.at(pParentPfo));
585 this->
PrintHits(parentCRHits, leadingParticleHitList,
"DR_PARENT_PFO");
588 const VertexList &deltaRayVertexList(pMatchedPfo->GetVertexList());
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;
675 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"eventNumber",
m_eventNumber - 1));
676 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"ID_CR", ID_CR));
677 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcE_CR", mcE_CR));
678 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPX_CR", mcPX_CR));
679 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPY_CR", mcPY_CR));
680 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPZ_CR", mcPZ_CR));
681 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nMCHitsTotal_CR", nMCHitsTotal_CR));
682 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nMCHitsU_CR", nMCHitsU_CR));
683 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nMCHitsV_CR", nMCHitsV_CR));
684 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nMCHitsW_CR", nMCHitsW_CR));
685 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcVertexX_CR", mcVertexX_CR));
686 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcVertexY_CR", mcVertexY_CR));
687 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcVertexZ_CR", mcVertexZ_CR));
688 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcEndX_CR", mcEndX_CR));
689 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcEndY_CR", mcEndY_CR));
690 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcEndZ_CR", mcEndZ_CR));
691 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nReconstructableChildCRLs", nReconstructableChildCRLs));
692 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nCorrectChildCRLs", nCorrectChildCRLs));
694 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"ID_CRL", &ID_CRL));
695 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcE_CRL", &mcE_CRL));
696 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPX_CRL", &mcPX_CRL));
697 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPY_CRL", &mcPY_CRL));
698 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPZ_CRL", &mcPZ_CRL));
699 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nMCHitsTotal_CRL", &nMCHitsTotal_CRL));
700 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nMCHitsU_CRL", &nMCHitsU_CRL));
701 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nMCHitsV_CRL", &nMCHitsV_CRL));
702 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nMCHitsW_CRL", &nMCHitsW_CRL));
703 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcVertexX_CRL", &mcVertexX_CRL));
704 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcVertexY_CRL", &mcVertexY_CRL));
705 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcVertexZ_CRL", &mcVertexZ_CRL));
706 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcEndX_CRL", &mcEndX_CRL));
707 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcEndY_CRL", &mcEndY_CRL));
708 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcEndZ_CRL", &mcEndZ_CRL));
709 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nAboveThresholdMatches_CRL", &nAboveThresholdMatches_CRL));
710 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"isCorrect_CRL", &isCorrect_CRL));
711 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"isCorrectParentLink_CRL", &isCorrectParentLink_CRL));
712 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchNHitsTotal_CRL", &bestMatchNHitsTotal_CRL));
713 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchNHitsU_CRL", &bestMatchNHitsU_CRL));
714 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchNHitsV_CRL", &bestMatchNHitsV_CRL));
715 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchNHitsW_CRL", &bestMatchNHitsW_CRL));
716 PANDORA_MONITORING_API(
717 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchNSharedHitsTotal_CRL", &bestMatchNSharedHitsTotal_CRL));
718 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchNSharedHitsU_CRL", &bestMatchNSharedHitsU_CRL));
719 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchNSharedHitsV_CRL", &bestMatchNSharedHitsV_CRL));
720 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchNSharedHitsW_CRL", &bestMatchNSharedHitsW_CRL));
721 PANDORA_MONITORING_API(SetTreeVariable(
722 this->GetPandora(),
m_treeName.c_str(),
"bestMatchNParentTrackHitsTotal_CRL", &bestMatchNParentTrackHitsTotal_CRL));
723 PANDORA_MONITORING_API(
724 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchNParentTrackHitsU_CRL", &bestMatchNParentTrackHitsU_CRL));
725 PANDORA_MONITORING_API(
726 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchNParentTrackHitsV_CRL", &bestMatchNParentTrackHitsV_CRL));
727 PANDORA_MONITORING_API(
728 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchNParentTrackHitsW_CRL", &bestMatchNParentTrackHitsW_CRL));
729 PANDORA_MONITORING_API(
730 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchNOtherTrackHitsTotal_CRL", &bestMatchNOtherTrackHitsTotal_CRL));
731 PANDORA_MONITORING_API(
732 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchNOtherTrackHitsU_CRL", &bestMatchNOtherTrackHitsU_CRL));
733 PANDORA_MONITORING_API(
734 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchNOtherTrackHitsV_CRL", &bestMatchNOtherTrackHitsV_CRL));
735 PANDORA_MONITORING_API(
736 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchNOtherTrackHitsW_CRL", &bestMatchNOtherTrackHitsW_CRL));
737 PANDORA_MONITORING_API(SetTreeVariable(
738 this->GetPandora(),
m_treeName.c_str(),
"bestMatchNOtherShowerHitsTotal_CRL", &bestMatchNOtherShowerHitsTotal_CRL));
739 PANDORA_MONITORING_API(
740 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchNOtherShowerHitsU_CRL", &bestMatchNOtherShowerHitsU_CRL));
741 PANDORA_MONITORING_API(
742 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchNOtherShowerHitsV_CRL", &bestMatchNOtherShowerHitsV_CRL));
743 PANDORA_MONITORING_API(
744 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchNOtherShowerHitsW_CRL", &bestMatchNOtherShowerHitsW_CRL));
745 PANDORA_MONITORING_API(SetTreeVariable(
746 this->GetPandora(),
m_treeName.c_str(),
"totalCRLHitsInBestMatchParentCR_CRL", &totalCRLHitsInBestMatchParentCR_CRL));
747 PANDORA_MONITORING_API(
748 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"uCRLHitsInBestMatchParentCR_CRL", &uCRLHitsInBestMatchParentCR_CRL));
749 PANDORA_MONITORING_API(
750 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"vCRLHitsInBestMatchParentCR_CRL", &vCRLHitsInBestMatchParentCR_CRL));
751 PANDORA_MONITORING_API(
752 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"wCRLHitsInBestMatchParentCR_CRL", &wCRLHitsInBestMatchParentCR_CRL));
754 PANDORA_MONITORING_API(
755 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchOtherShowerHitsID_CRL", &bestMatchOtherShowerHitsID_CRL));
756 PANDORA_MONITORING_API(SetTreeVariable(
757 this->GetPandora(),
m_treeName.c_str(),
"bestMatchOtherShowerHitsDistance_CRL", &bestMatchOtherShowerHitsDistance_CRL));
758 PANDORA_MONITORING_API(
759 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchOtherTrackHitsID_CRL", &bestMatchOtherTrackHitsID_CRL));
760 PANDORA_MONITORING_API(SetTreeVariable(
761 this->GetPandora(),
m_treeName.c_str(),
"bestMatchOtherTrackHitsDistance_CRL", &bestMatchOtherTrackHitsDistance_CRL));
762 PANDORA_MONITORING_API(
763 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchParentTrackHitsID_CRL", &bestMatchParentTrackHitsID_CRL));
764 PANDORA_MONITORING_API(SetTreeVariable(
765 this->GetPandora(),
m_treeName.c_str(),
"bestMatchParentTrackHitsDistance_CRL", &bestMatchParentTrackHitsDistance_CRL));
766 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchCRLHitsInCRID_CRL", &bestMatchCRLHitsInCRID_CRL));
767 PANDORA_MONITORING_API(
768 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchCRLHitsInCRDistance_CRL", &bestMatchCRLHitsInCRDistance_CRL));
770 PANDORA_MONITORING_API(FillTree(this->GetPandora(),
m_treeName.c_str()));
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;
790 const std::string stringTag(isCR ?
"MC_CR" :
"MC_DR");
792 for (
const CaloHit *
const pCaloHit : caloHitList)
794 const CartesianVector hitPosition(pCaloHit->GetPositionVector().GetX() - pCaloHit->GetX0(), pCaloHit->GetPositionVector().GetY(),
795 pCaloHit->GetPositionVector().GetZ());
797 PandoraMonitoringApi::AddMarkerToVisualization(this->GetPandora(), &hitPosition, stringTag, isCR ?
BLUE : RED, 2);
800 PandoraMonitoringApi::ViewEvent(this->GetPandora());
808 const CaloHitList otherTrackCaloHitList,
const CaloHitList parentTrackCaloHitList,
const std::string &stringTag)
const
810 for (
const CaloHit *
const pCaloHit : totalCaloHitList)
812 std::string newStringTag(stringTag);
813 const CartesianVector hitPosition(pCaloHit->GetPositionVector().GetX() - pCaloHit->GetX0(), pCaloHit->GetPositionVector().GetY(),
814 pCaloHit->GetPositionVector().GetZ());
816 if (std::find(otherShowerCaloHitList.begin(), otherShowerCaloHitList.end(), pCaloHit) != otherShowerCaloHitList.end())
818 newStringTag +=
"_OTHER_SHOWER";
820 PandoraMonitoringApi::AddMarkerToVisualization(this->GetPandora(), &hitPosition, newStringTag, VIOLET, 2);
822 else if (std::find(otherTrackCaloHitList.begin(), otherTrackCaloHitList.end(), pCaloHit) != otherTrackCaloHitList.end())
824 newStringTag +=
"_OTHER_TRACK";
826 PandoraMonitoringApi::AddMarkerToVisualization(this->GetPandora(), &hitPosition, newStringTag, RED, 2);
828 else if (std::find(parentTrackCaloHitList.begin(), parentTrackCaloHitList.end(), pCaloHit) != parentTrackCaloHitList.end())
830 newStringTag +=
"_PARENT_TRACK";
832 PandoraMonitoringApi::AddMarkerToVisualization(this->GetPandora(), &hitPosition, newStringTag,
BLUE, 2);
836 PandoraMonitoringApi::AddMarkerToVisualization(this->GetPandora(), &hitPosition, newStringTag, BLACK, 2);
840 PandoraMonitoringApi::ViewEvent(this->GetPandora());
848 const CaloHitList totalCaloHitList,
const CaloHitList leadingCaloHitList,
const std::string &stringTag)
const
850 for (
const CaloHit *
const pCaloHit : totalCaloHitList)
852 std::string newStringTag(stringTag);
853 const CartesianVector hitPosition(pCaloHit->GetPositionVector().GetX() - pCaloHit->GetX0(), pCaloHit->GetPositionVector().GetY(),
854 pCaloHit->GetPositionVector().GetZ());
856 if (std::find(leadingCaloHitList.begin(), leadingCaloHitList.end(), pCaloHit) != leadingCaloHitList.end())
858 newStringTag +=
"_LEADING";
860 PandoraMonitoringApi::AddMarkerToVisualization(this->GetPandora(), &hitPosition, newStringTag, RED, 2);
864 PandoraMonitoringApi::AddMarkerToVisualization(this->GetPandora(), &hitPosition, newStringTag, DARKGREEN, 2);
868 PandoraMonitoringApi::ViewEvent(this->GetPandora());
875 const CaloHitList &contaminationHits,
const CaloHitList &leadingMCHits, FloatVector &bestMatchContaminationHitsDistance)
const
877 CaloHitList leadingU, leadingV, leadingW;
882 for (
const CaloHit *
const pContaminationHit : contaminationHits)
884 const CartesianVector &hitPosition(pContaminationHit->GetPositionVector());
886 if ((pContaminationHit->GetHitType() == TPC_VIEW_U) && (!leadingU.empty()))
889 if ((pContaminationHit->GetHitType() == TPC_VIEW_V) && (!leadingV.empty()))
892 if ((pContaminationHit->GetHitType() == TPC_VIEW_W) && (!leadingW.empty()))
901 for (
const CaloHit *
const pCaloHit : inputList)
903 if (pCaloHit->GetHitType() == hitType)
904 outputList.push_back(pCaloHit);
912 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
915 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
918 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
921 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
924 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
927 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
930 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
935 PANDORA_RETURN_RESULT_IF_AND_IF(
936 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadVectorOfValues(xmlHandle,
"DeltaRayIDs",
m_deltaRayIDs));
938 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"DeltaRayMode",
m_deltaRayMode));
940 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"MichelMode",
m_michelMode));
942 PANDORA_RETURN_RESULT_IF_AND_IF(
943 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"CosmicRaysToSkip",
m_cosmicRaysToSkip));
945 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"Visualize",
m_visualize));
947 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
950 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
953 PANDORA_RETURN_RESULT_IF_AND_IF(
954 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"WriteRawMatchesToTree",
m_writeRawMatchesToTree));
const LArMCParticleHelper::PfoContributionMap & GetPfoToHitsMap() const
Get the pfo to hits map.
unsigned int m_minPrimaryGoodViews
the minimum number of primary good views
Header file for the pfo helper class.
static void GetMuonPfoContaminationContribution(const pandora::CaloHitList &cosmicRayPfoHitList, const pandora::CaloHitList &leadingMCHitList, pandora::CaloHitList &leadingHitsInParentCosmicRay)
Determine the leading MCParticle hits within a cosmic ray pfo hit list.
bool m_removeRecoCosmicRayHits
Whether to remove the reconstructed cosmic ray hits from leading particle metrics.
void DetermineIncorrectlyReconstructedCosmicRays(const pandora::MCParticleList *const pMCParticleList, const pandora::CaloHitList *const pCaloHitList, const pandora::PfoList *const pPfoList, pandora::MCParticleList &incorrectlyReconstructedCosmicRays) const
Perform the cosmic ray matching procedure and identify incorrectly reconstructed cosmic rays...
static void SelectReconstructableLeadingParticles(const pandora::MCParticleList *pMCParticleList, const pandora::CaloHitList *pCaloHitList, const ValidationParameters ¶meters, const pandora::CaloHitList &recoMuonHitList, LArMCParticleHelper::MCContributionMap &selectedMCParticlesToHitsMap)
Select target, reconstructable mc particles in the cosmic ray hierarchy.
std::unordered_map< const pandora::MCParticle *, pandora::CaloHitList > MCContributionMap
bool m_selectInputHits
whether to select input hits
const LArMCParticleHelper::MCContributionMap & GetTargetMCParticleToHitsMap() const
Get the target mc particle to hits map.
bool m_deltaRayMode
Whether to run in delta ray mode.
int m_eventNumber
The event number.
unsigned int m_minPrimaryGoodHits
the minimum number of primary good Hits
void InterpretMatching(const ValidationInfo &validationInfo, LArMCParticleHelper::MCParticleToPfoHitSharingMap &interpretedMCToPfoHitSharingMap) const
Apply an interpretative matching procedure to the comprehensive matches in the provided validation in...
static void GetPfoToReconstructable2DHitsMap(const pandora::PfoList &pfoList, const MCContributionMap &selectedMCParticleToHitsMap, PfoContributionMap &pfoToReconstructable2DHitsMap, const bool foldBackHierarchy)
Get mapping from Pfo to reconstructable 2D hits (=good hits belonging to a selected reconstructable M...
const LArMCParticleHelper::MCContributionMap & GetAllMCParticleToHitsMap() const
Get the all mc particle to hits map.
static void GetPfoMCParticleHitSharingMaps(const PfoContributionMap &pfoToReconstructable2DHitsMap, const MCContributionMapVector &selectedMCParticleToHitsMaps, PfoToMCParticleHitSharingMap &pfoToMCParticleHitSharingMap, MCParticleToPfoHitSharingMap &mcParticleToPfoHitSharingMap)
Get the mappings from Pfo -> pair (reconstructable MCparticles, number of reconstructable 2D hits sha...
void PerformUnfoldedMatching(const pandora::MCParticleList *const pMCParticleList, const pandora::CaloHitList *const pCaloHitList, const pandora::PfoList *const pPfoList, const pandora::CaloHitList &recoCosmicRayHitList, const float minHitSharingFraction, ValidationInfo &validationInfo) const
Perform the main matching procedure.
std::map< const pandora::MCParticle *, PfoToSharedHitsVector > MCParticleToPfoHitSharingMap
const LArMCParticleHelper::MCParticleToPfoHitSharingMap & GetMCToPfoHitSharingMap() const
Get the mc to pfo hit sharing map.
std::vector< int > m_deltaRayIDs
If filled, to contain the list leading particles to run metrics over.
void SetInterpretedMCToPfoHitSharingMap(const LArMCParticleHelper::MCParticleToPfoHitSharingMap &interpretedMCToPfoHitSharingMap)
Set the interpreted mc to pfo hit sharing map.
std::vector< int > IntVector
bool m_foldBackHierarchy
whether to fold the hierarchy back to the primary (neutrino) or leading particles (test beam) ...
bool m_michelMode
Whether to run in michel mode.
void RemoveIncorrectlyReconstructedCosmicRays(const pandora::MCParticleList *const pMCParticleList, const pandora::CaloHitList *const pCaloHitList, const pandora::PfoList *const pPfoList, ValidationInfo &validationInfo) const
Remove incorrectly reconstructed cosmic rays from main matching maps.
void FillValidationInfo(const pandora::MCParticleList *const pMCParticleList, const pandora::CaloHitList *const pCaloHitList, const pandora::PfoList *const pPfoList, ValidationInfo &validationInfo) const
Fill the validation info containers.
void ProcessOutput(const ValidationInfo &validationInfo, const bool useInterpretedMatching, const bool printToScreen, const bool fillTree) const
Print matching information in a provided validation info object, and write information to tree if con...
Header file for the lar monitoring helper helper class.
void SetMCToPfoHitSharingMap(const LArMCParticleHelper::MCParticleToPfoHitSharingMap &mcToPfoHitSharingMap)
Set the mc to pfo hit sharing map.
void GetHitsOfType(const pandora::CaloHitList &inputList, const pandora::HitType hitType, pandora::CaloHitList &outputList) const
To filter out the hits of a given type from an input list.
void GetRecoCosmicRayHits(const pandora::MCParticleList *const pMCParticleList, const pandora::CaloHitList *const pCaloHitList, const pandora::PfoList *const pPfoList, pandora::CaloHitList &recoCosmicRayHitList) const
Determine all reconstructable hits in cosmic ray pfos.
unsigned int m_minHitsForGoodView
the minimum number of Hits for a good view
bool m_visualize
Whether to visualize the MC and reco leading particles.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
float m_maxPhotonPropagation
the maximum photon propagation length
int m_cosmicRaysToSkip
The number of reconstructable cosmic rays to skip.
static void GetOrderedMCParticleVector(const LArMCParticleHelper::MCContributionMapVector &selectedMCParticleToGoodHitsMaps, pandora::MCParticleVector &orderedMCParticleVector)
Order input MCParticles by their number of hits.
static bool SortByMomentum(const pandora::MCParticle *const pLhs, const pandora::MCParticle *const pRhs)
Sort mc particles by their momentum.
static bool IsCosmicRay(const pandora::MCParticle *const pMCParticle)
Return true if passed a primary cosmic ray MCParticle.
void SetTargetMCParticleToHitsMap(const LArMCParticleHelper::MCContributionMap &targetMCParticleToHitsMap)
Set the target mc particle to hits map.
static bool IsMichel(const pandora::MCParticle *const pMCParticle)
Return true if input MCParticle is a child of a cosmic ray and has 'decay' process tag...
static const pandora::ParticleFlowObject * GetParentPfo(const pandora::ParticleFlowObject *const pPfo)
Get the primary parent pfo.
Header file for the cluster helper class.
Header file for the muon leading helper class.
bool m_ignoreIncorrectCosmicRays
Whether to remove the leading particles with incorrrectly reconstructed parents from metrics...
static void GetPfoMatchContamination(const pandora::MCParticle *const pLeadingParticle, const pandora::CaloHitList &matchedPfoHitList, pandora::CaloHitList &parentTrackHits, pandora::CaloHitList &otherTrackHits, pandora::CaloHitList &otherShowerHits)
Separate a leading pfo hit list according to the true owner of the hit e.g. other shower...
void PrintHits(const pandora::CaloHitList totalCaloHitList, const pandora::CaloHitList leadingCaloHitList, const std::string &stringTag) const
Print leading MCParticle hits.
std::vector< art::Ptr< simb::MCParticle > > MCParticleVector
const LArMCParticleHelper::MCParticleToPfoHitSharingMap & GetInterpretedMCToPfoHitSharingMap() const
Get the interpreted mc to pfo hit sharing map.
float m_minHitSharingFraction
the minimum Hit sharing fraction
void SetAllMCParticleToHitsMap(const LArMCParticleHelper::MCContributionMap &allMCParticleToHitsMap)
Set the all mc particle to hits map.
void FillContaminationHitsDistance(const pandora::CaloHitList &contaminationHits, const pandora::CaloHitList &leadingMCHits, pandora::FloatVector &bestMatchContaminationHitsDistance) const
Fill an input contamination hit distance vector with the closest distance of each contaminant hit to ...
LArMuonLeadingHelper::ValidationParameters m_validationParameters
The definition of a reconstructable MCParticle.
required by fuzzyCluster table::sbnd_g4_services gaushitTruthMatch pandora
std::pair< const pandora::ParticleFlowObject *, pandora::CaloHitList > PfoCaloHitListPair
std::string m_treeName
Name of output tree.
void SetPfoToHitsMap(const LArMCParticleHelper::PfoContributionMap &pfoToHitsMap)
Set the pfo to hits map.
bool m_writeRawMatchesToTree
Whether to write all matches to output tree.
Header file for the muon leading event validation algorithm.
bool IsGoodMatch(const pandora::CaloHitList &trueHits, const pandora::CaloHitList &recoHits, const pandora::CaloHitList &sharedHits) const
Whether a provided mc primary and pfo are deemed to be a good match.
std::unordered_map< const pandora::ParticleFlowObject *, pandora::CaloHitList > PfoContributionMap
static unsigned int CountHitsByType(const pandora::HitType hitType, const pandora::CaloHitList &caloHitList)
Count the number of calo hits, in a provided list, of a specified type.
virtual ~MuonLeadingEventValidationAlgorithm()
Destructor.
std::list< Vertex > VertexList
BEGIN_PROLOG could also be cout
std::map< const pandora::ParticleFlowObject *, MCParticleToSharedHitsVector > PfoToMCParticleHitSharingMap
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
static bool IsDeltaRay(const pandora::MCParticle *const pMCParticle)
Return true if input MCParticle is a child of a cosmic ray and has 'delta ray' process tag...
static float GetClosestDistance(const pandora::ClusterList &clusterList1, const pandora::ClusterList &clusterList2)
Get closest distance between clusters in a pair of cluster lists.
ValidationParameters class.