9 #include "Pandora/AlgorithmHeaders.h" 24 TestBeamHierarchyEventValidationAlgorithm::TestBeamHierarchyEventValidationAlgorithm() : m_eventNumber(0)
37 const CaloHitList *
const pCaloHitList,
const PfoList *
const pPfoList,
ValidationInfo &validationInfo)
const 39 if (pMCParticleList && pCaloHitList)
63 PfoList allConnectedPfos;
66 PfoList finalStatePfos;
67 for (
const ParticleFlowObject *
const pPfo : allConnectedPfos)
72 finalStatePfos.push_back(pPfo);
73 for (
const ParticleFlowObject *
const pDaughterPfo : pPfo->GetDaughterPfoList())
74 finalStatePfos.push_back(pDaughterPfo);
76 else if (pPfo->GetParentPfoList().empty())
78 finalStatePfos.push_back(pPfo);
102 const ValidationInfo &validationInfo,
const bool useInterpretedMatching,
const bool printToScreen,
const bool fillTree)
const 104 if (printToScreen && useInterpretedMatching)
105 std::cout <<
"---INTERPRETED-MATCHING-OUTPUT------------------------------------------------------------------" <<
std::endl;
106 else if (printToScreen)
107 std::cout <<
"---RAW-MATCHING-OUTPUT--------------------------------------------------------------------------" <<
std::endl;
109 PfoVector primaryPfoVector;
113 int pfoIndex(0), testBeamPfoIndex(0);
116 for (
const Pfo *
const pPrimaryPfo : primaryPfoVector)
118 pfoToIdMap.insert(PfoToIdMap::value_type(pPrimaryPfo, ++pfoIndex));
121 if (pRecoTestBeam && !testBeamPfoToIdMap.count(pRecoTestBeam))
122 testBeamPfoToIdMap.insert(PfoToIdMap::value_type(pRecoTestBeam, ++testBeamPfoIndex));
136 MCParticleVector mcPrimaryVectorCopy(mcPrimaryVector), triggeredBeamParticles;
138 mcPrimaryVector.clear();
140 for (
const MCParticle *
const pMCPrimary : mcPrimaryVectorCopy)
145 leadingToTriggeredMap.insert(LArMCParticleHelper::MCRelationMap::value_type(pMCPrimary, pParentMCParticle));
147 if (std::find(triggeredBeamParticles.begin(), triggeredBeamParticles.end(), pParentMCParticle) == triggeredBeamParticles.end())
148 triggeredBeamParticles.push_back(pParentMCParticle);
152 mcPrimaryVector.push_back(pMCPrimary);
156 for (
const MCParticle *
const pMCParent : triggeredBeamParticles)
159 mcPrimaryVector.push_back(pMCParent);
160 triggeredToLeading.insert(LArMCParticleHelper::MCParticleIntMap::value_type(pMCParent, 1));
161 triggeredToLeadingCounter.insert(LArMCParticleHelper::MCParticleIntMap::value_type(pMCParent, 0));
163 for (
const auto iter : leadingToTriggeredMap)
166 if (iter.second == pMCParent && iter.first != pMCParent)
168 mcPrimaryVector.push_back(iter.first);
169 triggeredToLeading.at(pMCParent)++;
174 PfoSet recoTestBeamHierarchies;
175 MCParticleList associatedMCPrimaries;
177 int nCorrectTB(0), nTotalTB(0), nCorrectTBHierarchy(0), nTotalTBHierarchy(0), nCorrectCR(0), nTotalCR(0);
178 int nFakeTBHierarchy(0), nFakeCR(0), nSplitTBHierarchy(0), nSplitCR(0), nLost(0), mcPrimaryIndex(0), nTargetMatches(0),
179 nTargetTBHierarchyMatches(0);
180 int nTargetCRMatches(0), nTargetGoodTBHierarchyMatches(0), nTargetTBHierarchySplits(0), nTargetTBHierarchyLosses(0);
181 IntVector mcPrimaryId, mcPrimaryPdg, mcPrimaryTier, nMCHitsTotal, nMCHitsU, nMCHitsV, nMCHitsW;
182 FloatVector mcPrimaryE, mcPrimaryPX, mcPrimaryPY, mcPrimaryPZ;
183 FloatVector mcPrimaryVtxX, mcPrimaryVtxY, mcPrimaryVtxZ, mcPrimaryEndX, mcPrimaryEndY, mcPrimaryEndZ;
184 IntVector nPrimaryMatchedPfos, nPrimaryMatchedTBHierarchyPfos, nPrimaryMatchedCRPfos;
185 IntVector bestMatchPfoId, bestMatchPfoPdg, bestMatchPfoTier, bestMatchPfoIsTestBeam, bestMatchPfoIsTestBeamHierarchy;
186 IntVector bestMatchPfoRecoTBId, bestMatchPfoNHitsTotal, bestMatchPfoNHitsU, bestMatchPfoNHitsV, bestMatchPfoNHitsW;
187 IntVector bestMatchPfoNSharedHitsTotal, bestMatchPfoNSharedHitsU, bestMatchPfoNSharedHitsV, bestMatchPfoNSharedHitsW;
190 std::stringstream targetSS;
193 for (
const MCParticle *
const pMCPrimary : mcPrimaryVector)
195 const bool hasMatch(mcToPfoHitSharingMap.count(pMCPrimary) && !mcToPfoHitSharingMap.at(pMCPrimary).empty());
198 if (!isTargetPrimary)
202 const bool hasVisibleTargets(
207 if (!hasMatch && !hasVisibleTargets)
210 associatedMCPrimaries.push_back(pMCPrimary);
211 const int nTargetPrimaries(associatedMCPrimaries.size());
226 bool isLastTestBeamLeading(
false);
227 if (isLeadingBeamParticle)
236 const float targetVertexX(targetVertex.GetX()), targetVertexY(targetVertex.GetY()), targetVertexZ(targetVertex.GetZ());
239 for (
int tier = 0; tier < mcHierarchyTier; tier++)
242 targetSS << (!isTargetPrimary ?
"(Non target) " :
"") <<
"PrimaryId " << mcPrimaryIndex <<
", TB " << isBeamParticle <<
", TB Hierarchy " 243 << isLeadingBeamParticle <<
", CR " << isCosmicRay <<
", MCPDG " << pMCPrimary->GetParticleId() <<
", Tier " << mcHierarchyTier
244 <<
", Energy " << pMCPrimary->GetEnergy() <<
", Dist. " << (pMCPrimary->GetEndpoint() - pMCPrimary->GetVertex()).GetMagnitude()
249 mcPrimaryId.push_back(mcPrimaryIndex);
250 mcPrimaryPdg.push_back(pMCPrimary->GetParticleId());
251 mcPrimaryTier.push_back(mcHierarchyTier);
252 mcPrimaryE.push_back(pMCPrimary->GetEnergy());
253 mcPrimaryPX.push_back(pMCPrimary->GetMomentum().GetX());
254 mcPrimaryPY.push_back(pMCPrimary->GetMomentum().GetY());
255 mcPrimaryPZ.push_back(pMCPrimary->GetMomentum().GetZ());
256 mcPrimaryVtxX.push_back(pMCPrimary->GetVertex().GetX());
257 mcPrimaryVtxY.push_back(pMCPrimary->GetVertex().GetY());
258 mcPrimaryVtxZ.push_back(pMCPrimary->GetVertex().GetZ());
259 mcPrimaryEndX.push_back(pMCPrimary->GetEndpoint().GetX());
260 mcPrimaryEndY.push_back(pMCPrimary->GetEndpoint().GetY());
261 mcPrimaryEndZ.push_back(pMCPrimary->GetEndpoint().GetZ());
262 nMCHitsTotal.push_back(mcPrimaryHitList.size());
267 int matchIndex(0), nPrimaryMatches(0), nPrimaryTBHierarchyMatches(0), nPrimaryCRMatches(0), nPrimaryGoodTBHierarchyMatches(0),
268 nPrimaryTBHierarchySplits(0);
275 const CaloHitList &sharedHitList(pfoToSharedHits.second);
276 const CaloHitList &pfoHitList(validationInfo.
GetPfoToHitsMap().at(pfoToSharedHits.first));
280 const bool isGoodMatch(this->
IsGoodMatch(mcPrimaryHitList, pfoHitList, sharedHitList));
284 const int pfoId(pfoToIdMap.at(pfoToSharedHits.first));
288 if (0 == matchIndex++)
290 bestMatchPfoId.push_back(pfoId);
291 bestMatchPfoPdg.push_back(pfoToSharedHits.first->GetParticleId());
292 bestMatchPfoTier.push_back(pfoHierarchyTier);
293 bestMatchPfoIsTestBeam.push_back(isRecoTestBeam ? 1 : 0);
294 bestMatchPfoIsTestBeamHierarchy.push_back(isRecoTestBeamHierarchy ? 1 : 0);
295 bestMatchPfoRecoTBId.push_back(recoTBId);
296 bestMatchPfoNHitsTotal.push_back(pfoHitList.size());
300 bestMatchPfoNSharedHitsTotal.push_back(sharedHitList.size());
304 bestMatchPfoX0.push_back(pfoToSharedHits.first->GetPropertiesMap().count(
"X0") ? pfoToSharedHits.first->GetPropertiesMap().at(
"X0")
309 const Vertex *
const pRecoVertex(
312 recoVertexX = pRecoVertex->GetPosition().GetX();
313 recoVertexY = pRecoVertex->GetPosition().GetY();
314 recoVertexZ = pRecoVertex->GetPosition().GetZ();
316 catch (
const StatusCodeException &)
326 if (isRecoTestBeamHierarchy && isGoodMatch)
327 ++nPrimaryTBHierarchyMatches;
328 if (!isRecoTestBeamHierarchy && isGoodMatch)
331 if (isRecoTestBeamHierarchy)
335 const bool isSplitRecoTBHierarchy(!recoTestBeamHierarchies.empty() && !recoTestBeamHierarchies.count(pRecoTB));
336 if (!isSplitRecoTBHierarchy && isGoodMatch)
337 ++nPrimaryGoodTBHierarchyMatches;
338 if (isSplitRecoTBHierarchy && isLeadingBeamParticle && isGoodMatch)
339 ++nPrimaryTBHierarchySplits;
340 recoTestBeamHierarchies.insert(pRecoTB);
343 for (
int tier = 0; tier < mcHierarchyTier; tier++)
346 targetSS <<
"-" << (!isGoodMatch ?
"(Below threshold) " :
"") <<
"MatchedPfoId " << pfoId <<
", TB " << isRecoTestBeam
347 <<
", TB Hierarchy " << isRecoTestBeamHierarchy;
348 if (isRecoTestBeamHierarchy)
349 targetSS <<
" [TBId: " << recoTBId <<
"]";
350 targetSS <<
", CR " << (!isRecoTestBeam && !isRecoTestBeamHierarchy) <<
", PDG " << pfoToSharedHits.first->GetParticleId()
351 <<
", Tier " << pfoHierarchyTier <<
", nMatchedHits " << sharedHitList.size() <<
" (" 360 if (mcToPfoHitSharingMap.at(pMCPrimary).empty())
362 for (
int tier = 0; tier < mcHierarchyTier; tier++)
364 targetSS <<
"-No matched Pfo" <<
std::endl;
365 bestMatchPfoId.push_back(-1);
366 bestMatchPfoPdg.push_back(0);
367 bestMatchPfoTier.push_back(-1);
368 bestMatchPfoIsTestBeam.push_back(0);
369 bestMatchPfoIsTestBeamHierarchy.push_back(0);
370 bestMatchPfoRecoTBId.push_back(-1);
371 bestMatchPfoNHitsTotal.push_back(0);
372 bestMatchPfoNHitsU.push_back(0);
373 bestMatchPfoNHitsV.push_back(0);
374 bestMatchPfoNHitsW.push_back(0);
375 bestMatchPfoNSharedHitsTotal.push_back(0);
376 bestMatchPfoNSharedHitsU.push_back(0);
377 bestMatchPfoNSharedHitsV.push_back(0);
378 bestMatchPfoNSharedHitsW.push_back(0);
382 nPrimaryMatchedPfos.push_back(nPrimaryMatches);
383 nPrimaryMatchedTBHierarchyPfos.push_back(nPrimaryTBHierarchyMatches);
384 nPrimaryMatchedCRPfos.push_back(nPrimaryCRMatches);
385 nTargetMatches += nPrimaryMatches;
386 nTargetTBHierarchyMatches += nPrimaryTBHierarchyMatches;
387 nTargetCRMatches += nPrimaryCRMatches;
388 nTargetGoodTBHierarchyMatches += nPrimaryGoodTBHierarchyMatches;
389 nTargetTBHierarchySplits += nPrimaryTBHierarchySplits;
390 if (0 == nPrimaryMatches)
391 ++nTargetTBHierarchyLosses;
396 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"eventNumber",
m_eventNumber - 1));
397 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcNuanceCode", mcNuanceCode));
398 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"isBeamParticle", isBeamParticle));
399 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"isCosmicRay", isCosmicRay));
400 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nTargetPrimaries", nTargetPrimaries));
401 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"targetVertexX", targetVertexX));
402 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"targetVertexY", targetVertexY));
403 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"targetVertexZ", targetVertexZ));
404 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"recoVertexX", recoVertexX));
405 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"recoVertexY", recoVertexY));
406 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"recoVertexZ", recoVertexZ));
407 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPrimaryId", &mcPrimaryId));
408 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPrimaryPdg", &mcPrimaryPdg));
409 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPrimaryTier", &mcPrimaryTier));
410 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPrimaryE", &mcPrimaryE));
411 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPrimaryPX", &mcPrimaryPX));
412 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPrimaryPY", &mcPrimaryPY));
413 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPrimaryPZ", &mcPrimaryPZ));
414 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPrimaryVtxX", &mcPrimaryVtxX));
415 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPrimaryVtxY", &mcPrimaryVtxY));
416 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPrimaryVtxZ", &mcPrimaryVtxZ));
417 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPrimaryEndX", &mcPrimaryEndX));
418 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPrimaryEndY", &mcPrimaryEndY));
419 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPrimaryEndZ", &mcPrimaryEndZ));
420 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPrimaryNHitsTotal", &nMCHitsTotal));
421 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPrimaryNHitsU", &nMCHitsU));
422 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPrimaryNHitsV", &nMCHitsV));
423 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"mcPrimaryNHitsW", &nMCHitsW));
424 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nPrimaryMatchedPfos", &nPrimaryMatchedPfos));
425 PANDORA_MONITORING_API(
426 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nPrimaryMatchedTBHierarchyPfos", &nPrimaryMatchedTBHierarchyPfos));
427 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nPrimaryMatchedCRPfos", &nPrimaryMatchedCRPfos));
428 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchPfoId", &bestMatchPfoId));
429 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchPfoPdg", &bestMatchPfoPdg));
430 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchPfoTier", &bestMatchPfoTier));
431 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchPfoNHitsTotal", &bestMatchPfoNHitsTotal));
432 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchPfoNHitsU", &bestMatchPfoNHitsU));
433 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchPfoNHitsV", &bestMatchPfoNHitsV));
434 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchPfoNHitsW", &bestMatchPfoNHitsW));
435 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchPfoNSharedHitsTotal", &bestMatchPfoNSharedHitsTotal));
436 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchPfoNSharedHitsU", &bestMatchPfoNSharedHitsU));
437 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchPfoNSharedHitsV", &bestMatchPfoNSharedHitsV));
438 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchPfoNSharedHitsW", &bestMatchPfoNSharedHitsW));
439 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchPfoX0", &bestMatchPfoX0));
440 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nTargetMatches", nTargetMatches));
441 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nTargetTBHierarchyMatches", nTargetTBHierarchyMatches));
442 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nTargetCRMatches", nTargetCRMatches));
444 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchPfoIsTestBeam", &bestMatchPfoIsTestBeam));
445 PANDORA_MONITORING_API(
446 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchPfoIsTestBeamHierarchy", &bestMatchPfoIsTestBeamHierarchy));
447 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"bestMatchPfoRecoTBId", &bestMatchPfoRecoTBId));
448 PANDORA_MONITORING_API(
449 SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nTargetGoodTBHierarchyMatches", nTargetGoodTBHierarchyMatches));
450 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nTargetTBHierarchySplits", nTargetTBHierarchySplits));
451 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"nTargetTBHierarchyLosses", nTargetTBHierarchyLosses));
454 if (isCosmicRay || isLastTestBeamLeading)
459 const int interactionTypeInt(static_cast<int>(interactionType));
462 const int isCorrectTB(isBeamParticle && (nTargetTBHierarchyMatches == 1) && (nTargetCRMatches == 0));
463 const int isCorrectTBHierarchy(isLeadingBeamParticle && (nTargetGoodTBHierarchyMatches == nTargetTBHierarchyMatches) &&
464 (nTargetGoodTBHierarchyMatches == nTargetPrimaries) && (nTargetCRMatches == 0) &&
465 (nTargetTBHierarchySplits == 0) && (nTargetTBHierarchyLosses == 0));
466 const int isCorrectCR(isCosmicRay && (nTargetTBHierarchyMatches == 0) && (nTargetCRMatches == 1));
467 const int isFakeTBHierarchy(isCosmicRay && (nTargetTBHierarchyMatches > 0));
468 const int isFakeCR(!isCosmicRay && (nTargetCRMatches > 0));
469 const int isSplitTBHierarchy(!isCosmicRay && ((nTargetTBHierarchyMatches > nTargetPrimaries) || (nTargetTBHierarchySplits > 0)));
470 const int isSplitCR(isCosmicRay && (nTargetCRMatches > 1));
471 const int isLost(nTargetMatches == 0);
473 std::stringstream outcomeSS;
474 const bool isBeamHierarchy((mcNuanceCode == 2001) | (mcNuanceCode == 2000));
476 <<
", CR " << isCosmicRay <<
")" <<
std::endl;
480 if (isLastTestBeamLeading)
486 if (isCorrectTBHierarchy)
487 ++nCorrectTBHierarchy;
490 if (isFakeTBHierarchy)
494 if (isSplitTBHierarchy)
501 if (isCorrectTBHierarchy)
502 outcomeSS <<
"IsCorrectTBHierarchy";
504 outcomeSS <<
"IsCorrectCR ";
505 if (isFakeTBHierarchy)
506 outcomeSS <<
"IsFake" << name <<
" ";
508 outcomeSS <<
"IsFakeCR ";
509 if (isSplitTBHierarchy)
510 outcomeSS <<
"isSplit" << name <<
" ";
512 outcomeSS <<
"IsSplitCR ";
514 outcomeSS <<
"IsLost ";
515 if (nTargetTBHierarchyMatches > 0)
516 outcomeSS <<
"(N" << name <<
"Matches: " << nTargetTBHierarchyMatches <<
") ";
517 if (nTargetTBHierarchyLosses > 0)
518 outcomeSS <<
"(N" << name <<
"Losses: " << nTargetTBHierarchyLosses <<
") ";
519 if (nTargetTBHierarchySplits > 0)
520 outcomeSS <<
"(N" << name <<
"Splits: " << nTargetTBHierarchySplits <<
") ";
521 if (nTargetCRMatches > 0)
522 outcomeSS <<
"(NCRMatches: " << nTargetCRMatches <<
") ";
524 std::cout << outcomeSS.str() << std::endl << targetSS.str() <<
std::endl;
528 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"interactionType", interactionTypeInt));
529 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"isCorrectTBHierarchy", isCorrectTBHierarchy));
530 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"isCorrectCR", isCorrectCR));
531 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"isFakeTBHierarchy", isFakeTBHierarchy));
532 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"isFakeCR", isFakeCR));
533 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"isSplitTBHierarchy", isSplitTBHierarchy));
534 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"isSplitCR", isSplitCR));
535 PANDORA_MONITORING_API(SetTreeVariable(this->GetPandora(),
m_treeName.c_str(),
"isLost", isLost));
536 PANDORA_MONITORING_API(FillTree(this->GetPandora(),
m_treeName.c_str()));
541 associatedMCPrimaries.clear();
543 nTargetTBHierarchyMatches = 0;
544 nTargetCRMatches = 0;
545 nTargetGoodTBHierarchyMatches = 0;
546 nTargetTBHierarchySplits = 0;
547 nTargetTBHierarchyLosses = 0;
549 mcPrimaryPdg.clear();
550 mcPrimaryTier.clear();
551 nMCHitsTotal.clear();
559 mcPrimaryVtxX.clear();
560 mcPrimaryVtxY.clear();
561 mcPrimaryVtxZ.clear();
562 mcPrimaryEndX.clear();
563 mcPrimaryEndY.clear();
564 mcPrimaryEndZ.clear();
565 nPrimaryMatchedPfos.clear();
566 nPrimaryMatchedTBHierarchyPfos.clear();
567 nPrimaryMatchedCRPfos.clear();
568 bestMatchPfoId.clear();
569 bestMatchPfoPdg.clear();
570 bestMatchPfoTier.clear();
571 bestMatchPfoIsTestBeam.clear();
572 bestMatchPfoIsTestBeamHierarchy.clear();
573 bestMatchPfoRecoTBId.clear();
574 bestMatchPfoNHitsTotal.clear();
575 bestMatchPfoNHitsU.clear();
576 bestMatchPfoNHitsV.clear();
577 bestMatchPfoNHitsW.clear();
578 bestMatchPfoNSharedHitsTotal.clear();
579 bestMatchPfoNSharedHitsU.clear();
580 bestMatchPfoNSharedHitsV.clear();
581 bestMatchPfoNSharedHitsW.clear();
582 bestMatchPfoX0.clear();
586 if (useInterpretedMatching)
588 std::stringstream summarySS;
589 summarySS <<
"---SUMMARY--------------------------------------------------------------------------------------" <<
std::endl;
590 if (nTotalTBHierarchy > 0)
591 summarySS <<
"#CorrectTBHierarchy: " << nCorrectTBHierarchy <<
"/" << nTotalTBHierarchy <<
", Fraction: " 592 << (nTotalTBHierarchy > 0 ?
static_cast<float>(nCorrectTBHierarchy) / static_cast<float>(nTotalTBHierarchy) : 0.f)
595 summarySS <<
"#CorrectCR: " << nCorrectCR <<
"/" << nTotalCR
596 <<
", Fraction: " << (nTotalCR > 0 ?
static_cast<float>(nCorrectCR) / static_cast<float>(nTotalCR) : 0.f) << std::endl;
597 if (nFakeTBHierarchy > 0)
598 summarySS <<
"#Fake" << name <<
": " << nFakeTBHierarchy <<
" ";
600 summarySS <<
"#FakeCR: " << nFakeCR <<
" ";
601 if (nSplitTBHierarchy > 0)
602 summarySS <<
"#Split" << name <<
": " << nSplitTBHierarchy <<
" ";
604 summarySS <<
"#SplitCR: " << nSplitCR <<
" ";
606 summarySS <<
"#Lost: " << nLost <<
" ";
607 if (nFakeTBHierarchy || nFakeCR || nSplitTBHierarchy || nSplitCR || nLost)
610 std::cout << summarySS.str();
614 std::cout <<
"------------------------------------------------------------------------------------------------" << std::endl
const LArMCParticleHelper::PfoContributionMap & GetPfoToHitsMap() const
Get the pfo to hits map.
Header file for the pfo helper class.
std::unordered_map< const pandora::MCParticle *, pandora::CaloHitList > MCContributionMap
static void GetTestBeamHierarchyPfoToReconstructable2DHitsMap(const pandora::PfoList &pfoList, const MCContributionMap &selectedMCParticleToHitsMap, PfoContributionMap &pfoToReconstructable2DHitsMap, const bool foldBackHierarchy)
Get mapping from Pfo in reconstructed test beam hierarchy to reconstructable 2D hits (=good hits belo...
const LArMCParticleHelper::MCContributionMap & GetTargetMCParticleToHitsMap() const
Get the target mc particle to hits map.
Header file for the interaction type helper class.
static bool IsLeadingBeamParticle(const pandora::MCParticle *const pMCParticle)
Returns true if passed a leading beam MCParticle.
int m_fileIdentifier
The input file identifier.
unsigned int m_minPrimaryGoodHits
the minimum number of primary good Hits
static const pandora::Vertex * GetVertex(const pandora::ParticleFlowObject *const pPfo)
Get the pfo vertex.
void InterpretMatching(const ValidationInfo &validationInfo, LArMCParticleHelper::MCParticleToPfoHitSharingMap &interpretedMCToPfoHitSharingMap) const
Apply an interpretative matching procedure to the comprehensive matches in the provided validation in...
~TestBeamHierarchyEventValidationAlgorithm()
Destructor.
const LArMCParticleHelper::MCContributionMap & GetAllMCParticleToHitsMap() const
Get the all mc particle to hits map.
static int GetHierarchyTier(const pandora::MCParticle *const pMCParticle)
Determine the position in the hierarchy for the MCParticle.
static const pandora::Vertex * GetTestBeamInteractionVertex(const pandora::ParticleFlowObject *const pPfo)
Get the pfo test beam interaction vertex.
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...
std::map< const pandora::MCParticle *, PfoToSharedHitsVector > MCParticleToPfoHitSharingMap
const LArMCParticleHelper::MCParticleToPfoHitSharingMap & GetMCToPfoHitSharingMap() const
Get the mc to pfo hit sharing map.
void SetInterpretedMCToPfoHitSharingMap(const LArMCParticleHelper::MCParticleToPfoHitSharingMap &interpretedMCToPfoHitSharingMap)
Set the interpreted mc to pfo hit sharing map.
std::vector< int > IntVector
std::vector< art::Ptr< simb::MCParticle > > MCParticleVector
bool m_foldBackHierarchy
whether to fold the hierarchy back to the primary (neutrino) or leading particles (test beam) ...
static void SelectReconstructableTestBeamHierarchyMCParticles(const pandora::MCParticleList *pMCParticleList, const pandora::CaloHitList *pCaloHitList, const PrimaryParameters ¶meters, std::function< bool(const pandora::MCParticle *const)> fCriteria, MCContributionMap &selectedMCParticlesToHitsMap)
Select target, reconstructable mc particles in the relevant hierarchy that match given criteria...
int m_eventNumber
The event number.
Header file for the lar monitoring helper helper class.
void SetMCToPfoHitSharingMap(const LArMCParticleHelper::MCParticleToPfoHitSharingMap &mcToPfoHitSharingMap)
Set the mc to pfo hit sharing map.
static unsigned int GetNuanceCode(const pandora::MCParticle *const pMCParticle)
Get the nuance code of an MCParticle.
unsigned int m_minHitsForGoodView
the minimum number of Hits for a good view
Header file for the test beam hierarchy event validation algorithm.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
static void GetOrderedMCParticleVector(const LArMCParticleHelper::MCContributionMapVector &selectedMCParticleToGoodHitsMaps, pandora::MCParticleVector &orderedMCParticleVector)
Order input MCParticles by their number of hits.
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 void SelectReconstructableMCParticles(const pandora::MCParticleList *pMCParticleList, const pandora::CaloHitList *pCaloHitList, const PrimaryParameters ¶meters, std::function< bool(const pandora::MCParticle *const)> fCriteria, MCContributionMap &selectedMCParticlesToHitsMap)
Select target, reconstructable mc particles that match given criteria.
static int GetHierarchyTier(const pandora::ParticleFlowObject *const pPfo)
Determine the position in the hierarchy for the MCParticle.
static bool IsTestBeam(const pandora::ParticleFlowObject *const pPfo)
Whether a pfo is a test beam particle.
std::unordered_map< const pandora::MCParticle *, int > MCParticleIntMap
static const pandora::ParticleFlowObject * GetParentPfo(const pandora::ParticleFlowObject *const pPfo)
Get the primary parent pfo.
LArMCParticleHelper::PrimaryParameters m_primaryParameters
The mc particle primary selection parameters.
static std::string ToString(const InteractionType interactionType)
Get a string representation of an interaction type.
static bool IsBeamParticle(const pandora::MCParticle *const pMCParticle)
Returns true if passed a primary beam MCParticle.
static const pandora::MCParticle * GetParentMCParticle(const pandora::MCParticle *const pMCParticle)
Get the parent mc particle.
static void GetOrderedPfoVector(const LArMCParticleHelper::PfoContributionMap &pfoToReconstructable2DHitsMap, pandora::PfoVector &orderedPfoVector)
Order input Pfos by their number of hits.
const LArMCParticleHelper::MCParticleToPfoHitSharingMap & GetInterpretedMCToPfoHitSharingMap() const
Get the interpreted mc to pfo hit sharing map.
static int max(int a, int b)
float m_minHitSharingFraction
the minimum Hit sharing fraction
InteractionType
InteractionType enum.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
void SetAllMCParticleToHitsMap(const LArMCParticleHelper::MCContributionMap &allMCParticleToHitsMap)
Set the all mc particle to hits map.
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.
std::unordered_map< const pandora::ParticleFlowObject *, unsigned int > PfoToIdMap
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...
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.
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
Dft::FloatVector FloatVector
static InteractionType GetTestBeamHierarchyInteractionType(const pandora::MCParticleList &mcPrimaryList)
Get the test beam hierarchy interaction type of an event.
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 void GetAllConnectedPfos(const pandora::PfoList &inputPfoList, pandora::PfoList &outputPfoList)
Get a flat list of all pfos, recursively including all daughters and parents associated with those pf...
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.
std::unordered_map< const pandora::MCParticle *, const pandora::MCParticle * > MCRelationMap
static bool IsTestBeamFinalState(const pandora::ParticleFlowObject *const pPfo)
Whether a pfo is a final-state particle from a test beam particle interaction.
std::map< const pandora::ParticleFlowObject *, MCParticleToSharedHitsVector > PfoToMCParticleHitSharingMap
QTextStream & endl(QTextStream &s)