Whether pfo is identified as a clear track.
91 object_creation::ParticleFlowObject::Metadata metadata;
92 metadata.m_propertiesToAdd[
"TrackScore"] = -1.f;
93 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::ParticleFlowObject::AlterMetadata(*
this, pPfo, metadata));
95 return (pPfo->GetParticleId() == MU_MINUS);
99 ClusterList wClusterList;
104 StringVector featureOrder;
108 for (
auto const &[featureKey, featureValue] : featureMap)
112 if (!featureValue.IsInitialized())
116 object_creation::ParticleFlowObject::Metadata metadata;
117 metadata.m_propertiesToAdd[
"TrackScore"] = -1.f;
118 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::ParticleFlowObject::AlterMetadata(*
this, pPfo, metadata));
120 return (pPfo->GetParticleId() == MU_MINUS);
126 const MCParticleList *pMCParticleList(
nullptr);
127 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetList(*
this,
m_mcParticleListName, pMCParticleList));
129 const CaloHitList *pCaloHitList(
nullptr);
130 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetList(*
this,
m_caloHitListName, pCaloHitList));
146 if (pfoToReconstructable2DHitsMap.empty())
152 pfoToReconstructable2DHitsMap, mcParticlesToGoodHitsMaps, pfoToMCParticleHitSharingMap, mcParticleToPfoHitSharingMap);
153 if (pfoToMCParticleHitSharingMap.empty())
156 unsigned int nHitsInBestMCParticleTotal(0);
157 unsigned int nHitsSharedWithBestMCParticleTotal(0);
158 int bestMCParticlePdgCode(0);
159 CartesianVector threeDVertexPosition(0.f, 0.f, 0.f);
160 float hitsShower(0), hitsTrack(0);
165 const pandora::MCParticle *
const pAssociatedMCParticle(mcParticleCaloHitListPair.first);
166 const CaloHitList &allMCHits(targetMCParticleToHitsMap.at(pAssociatedMCParticle));
167 const CaloHitList &associatedMCHits(mcParticleCaloHitListPair.second);
169 if ((PHOTON == pAssociatedMCParticle->GetParticleId()) || (E_MINUS ==
std::abs(pAssociatedMCParticle->GetParticleId())))
170 hitsShower += associatedMCHits.size();
172 hitsTrack += associatedMCHits.size();
174 if (associatedMCHits.size() > nHitsSharedWithBestMCParticleTotal)
176 nHitsSharedWithBestMCParticleTotal = associatedMCHits.size();
177 nHitsInBestMCParticleTotal = allMCHits.size();
178 bestMCParticlePdgCode = pAssociatedMCParticle->GetParticleId();
179 threeDVertexPosition = pAssociatedMCParticle->GetVertex();
183 const float trackShowerHitsRatio((hitsTrack + hitsShower) > 0 ? hitsTrack / (hitsTrack + hitsShower) : 0.f);
184 const bool isTrueTrack(trackShowerHitsRatio >= 0.5);
186 const int nHitsInPfoTotal(pfoToReconstructable2DHitsMap.at(pPfo).size());
187 const float purity((nHitsInPfoTotal > 0) ? nHitsSharedWithBestMCParticleTotal / static_cast<float>(nHitsInPfoTotal) : 0.f);
188 const float completeness(
189 (nHitsInBestMCParticleTotal > 0) ? nHitsSharedWithBestMCParticleTotal / static_cast<float>(nHitsInBestMCParticleTotal) : 0.f);
191 CaloHitList checkHitListW;
193 CaloHitList checkHitListU;
195 CaloHitList checkHitListV;
197 CaloHitList checkHitListAll;
198 checkHitListAll.splice(checkHitListAll.end(), checkHitListW);
199 checkHitListAll.splice(checkHitListAll.end(), checkHitListU);
200 checkHitListAll.splice(checkHitListAll.end(), checkHitListV);
209 unsigned int showerCount(0), allCount(0);
210 for (
const CaloHit *pHit : checkHitListAll)
212 if (hitToMCMap.find(pHit) != hitToMCMap.end())
214 const MCParticle *pHitMCParticle(hitToMCMap.at(pHit));
215 if ((PHOTON == pHitMCParticle->GetParticleId()) || (E_MINUS ==
std::abs(pHitMCParticle->GetParticleId())))
223 const float showerProbability(showerCount / static_cast<float>(allCount));
224 const bool mischaracterisedPfo((showerProbability < 0.5f && !isTrueTrack) || (showerProbability > 0.5 && isTrueTrack) ?
true :
false);
225 const bool isMainMCParticleSet(bestMCParticlePdgCode != 0);
227 if (isMainMCParticleSet)
232 const std::string
end = ((wClusterList.empty()) ?
"noChargeInfo.txt" :
".txt");
242 bool isTrueTrack(
false);
243 bool isMainMCParticleSet(
false);
248 isTrueTrack = ((PHOTON != pMCParticle->GetParticleId()) && (E_MINUS !=
std::abs(pMCParticle->GetParticleId())));
249 isMainMCParticleSet = (pMCParticle->GetParticleId() != 0);
251 catch (
const StatusCodeException &)
255 if (isMainMCParticleSet)
258 outputFile.append(wClusterList.empty() ?
"noChargeInfo.txt" :
".txt");
273 object_creation::ParticleFlowObject::Metadata metadata;
274 metadata.m_propertiesToAdd[
"TrackScore"] =
score;
277 for (
auto const &[
name,
value] : featureMap)
279 metadata.m_propertiesToAdd[
name] =
value.Get();
282 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::ParticleFlowObject::AlterMetadata(*
this, pPfo, metadata));
bool m_enableProbability
Whether to use probabilities instead of binary classification.
std::string m_trainingOutputFile
The training output file.
static bool Classify(const MvaInterface &classifier, TCONTAINER &&featureContainer)
Use the trained classifier to predict the boolean class of an example.
pandora::StringVector m_algorithmToolNamesNoChargeInfo
Vector of strings saving feature tool order for use in feature calculation (missing W view) ...
static bool IsThreeD(const pandora::ParticleFlowObject *const pPfo)
Does Pfo contain 3D clusters.
std::unordered_map< const pandora::MCParticle *, pandora::CaloHitList > MCContributionMap
std::string m_caloHitListName
Name of input calo hit list.
std::pair< const pandora::MCParticle *, pandora::CaloHitList > MCParticleCaloHitListPair
LArMCParticleHelper::PrimaryParameters m_primaryParameters
The mc particle primary selection parameters.
static void GetClusters(const pandora::PfoList &pfoList, const pandora::HitType &hitType, pandora::ClusterList &clusterList)
Get a list of clusters of a particular hit type from a list of pfos.
static pandora::StatusCode ProduceTrainingExample(const std::string &trainingOutputFile, const bool result, TCONTAINER &&featureContainer)
Produce a training example with the given features and result.
std::string m_mcParticleListName
Name of input MC particle list.
static MvaFeatureVector CalculateFeatures(const MvaFeatureToolVector< Ts...> &featureToolVector, TARGS &&...args)
Calculate the features in a given feature tool vector.
bool m_testBeamMode
Whether the training set is from a test beam experiment.
T m_mvaNoChargeInfo
The mva for missing W view.
BEGIN_PROLOG or score(default)}sbnd_crttrackmatchingalg_crID
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...
PfoCharacterisationFeatureTool::FeatureToolMap m_featureToolMapNoChargeInfo
FeatureToolMap as a map for missing W view.
std::unordered_map< const pandora::CaloHit *, const pandora::MCParticle * > CaloHitToMCMap
bool m_applyReconstructabilityChecks
Whether to apply reconstructability checks during training.
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
bool m_applyFiducialCut
Whether to apply a fiducial volume cut during training.
bool m_foldBackHierarchy
whether to fold the hierarchy back to the primary (neutrino) or leading particles (test beam) ...
static void GetMCPrimaryMap(const pandora::MCParticleList *const pMCParticleList, MCRelationMap &mcPrimaryMap)
Get mapping from individual mc particles (in a provided list) and their primary parent mc particles...
MvaTypes::MvaFeatureMap MvaFeatureMap
static const pandora::MCParticle * GetMainMCParticle(const pandora::ParticleFlowObject *const pPfo)
Find the mc particle making the largest contribution to 2D clusters in a specified pfo...
std::map< std::string, MvaFeatureTool< Ts...> * > FeatureToolMap
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 void GetMCParticleToCaloHitMatches(const pandora::CaloHitList *const pCaloHitList, const MCRelationMap &mcToTargetMCMap, CaloHitToMCMap &hitToMCMap, MCContributionMap &mcToTrueHitListMap)
Match calo hits to their parent particles.
static bool IsBeamParticle(const pandora::MCParticle *const pMCParticle)
Returns true if passed a primary beam MCParticle.
auto end(FixedBins< T, C > const &) noexcept
bool PassesFiducialCut(const pandora::CartesianVector &vertex) const
Checks if the interaction vertex is within the fiducial volume.
bool m_trainingSetMode
Whether to train.
std::vector< MCContributionMap > MCContributionMapVector
float m_minProbabilityCut
The minimum probability to label a cluster as track-like.
PfoCharacterisationFeatureTool::FeatureToolMap m_featureToolMapThreeD
FeatureToolMap as a map for 3D info.
std::vector< MCParticleCaloHitListPair > MCParticleToSharedHitsVector
static double CalculateProbability(const MvaInterface &classifier, TCONTAINER &&featureContainer)
Use the trained mva to calculate a classification probability for an example.
pandora::StringVector m_algorithmToolNames
Vector of strings saving feature tool order for use in feature calculation.
std::unordered_map< const pandora::ParticleFlowObject *, pandora::CaloHitList > PfoContributionMap
static void GetCaloHits(const pandora::PfoList &pfoList, const pandora::HitType &hitType, pandora::CaloHitList &caloHitList)
Get a list of calo hits of a particular hit type from a list of pfos.
static bool IsBeamNeutrinoFinalState(const pandora::MCParticle *const pMCParticle)
Returns true if passed a primary neutrino final state MCParticle.
std::unordered_map< const pandora::MCParticle *, const pandora::MCParticle * > MCRelationMap
bool m_persistFeatures
Whether to write the features to the properties map.
std::map< const pandora::ParticleFlowObject *, MCParticleToSharedHitsVector > PfoToMCParticleHitSharingMap