11 #include <framework/logging/Logger.h>
13 #include <framework/geometry/BFieldManager.h>
15 #include <tracking/modules/vxdtfRedesign/TrackFinderVXDBasicPathFinderModule.h>
16 #include <tracking/trackFindingVXD/algorithms/NetworkPathConversion.h>
17 #include <tracking/trackFindingVXD/segmentNetwork/NodeNetworkHelperFunctions.h>
29 setDescription(
"The TrackFinderVXD BasicPathFinder module."
30 "\n It uses the output produced by the SegmentNetworkProducerModule to create"
31 "SpacePointTrackCands by simply storing all possible paths stored in the SegmentNetwork.");
32 setPropertyFlags(c_ParallelProcessingCertified);
35 addParam(
"NetworkName",
37 "name for StoreObjPtr< DirectedNodeNetwork> which contains the networks needed.",
40 addParam(
"EventLevelTrackingInfoName",
41 m_PARAMEventLevelTrackingInfoName,
42 "Name of the EventLevelTrackingInfo that should be used (different one for ROI-finding).",
43 string(
"EventLevelTrackingInfo"));
45 addParam(
"SpacePointTrackCandArrayName",
46 m_PARAMSpacePointTrackCandArrayName,
47 "name for StoreArray< SpacePointTrackCand> to be filled.",
50 addParam(
"printNetworks",
52 "If true for each event and each network created a file with a graph is created.",
bool(
false));
54 addParam(
"strictSeeding",
56 "Regulates if every node with enough notes below it is used as a seed or only the outermost nodes.",
59 addParam(
"storeSubsets",
61 "Regulates if every subset of sufficient length of a path shall be collected as separate path or not.",
64 addParam(
"setFamilies",
66 "Additionally assign a common family identifier to all Tracks that are share a node.",
69 addParam(
"selectBestPerFamily",
70 m_PARAMselectBestPerFamily,
71 "Select only the best track candidates for each family.",
74 addParam(
"xBestPerFamily",
75 m_PARAMxBestPerFamily,
76 "Number of best track candidates to be created per family.",
77 m_PARAMxBestPerFamily);
79 addParam(
"maxFamilies",
81 "Maximal number of families allowed in an event; if exceeded, the event execution will be skipped.",
86 "Maximal number of paths per an event; if exceeded, the event execution will be skipped.",
91 void TrackFinderVXDBasicPathFinderModule::initialize()
93 m_network.isRequired(m_PARAMNetworkName);
94 m_TCs.registerInDataStore(m_PARAMSpacePointTrackCandArrayName, DataStore::c_DontWriteOut | DataStore::c_ErrorIfAlreadyRegistered);
96 if (m_PARAMselectBestPerFamily) {
97 m_sptcSelector = std::make_unique<SPTCSelectorXBestPerFamily>(m_PARAMxBestPerFamily);
100 m_eventLevelTrackingInfo.isRequired(m_PARAMEventLevelTrackingInfoName);
104 void TrackFinderVXDBasicPathFinderModule::beginRun()
106 if (m_PARAMselectBestPerFamily) {
108 double bFieldZ = BFieldManager::getFieldInTesla({0, 0, 0}).Z();
109 m_sptcSelector->setMagneticFieldForQE(bFieldZ);
114 void TrackFinderVXDBasicPathFinderModule::event()
120 if (m_PARAMprintNetworks) {
121 std::string fileName = m_PARAMsecMapName +
"_BasicPF_Ev" + std::to_string(m_eventCounter);
122 DNN::printCANetwork<Segment< Belle2::TrackNode>>(segmentNetwork, fileName);
126 int nRounds = m_cellularAutomaton.apply(segmentNetwork);
128 B2ERROR(
"Basic Path Finder failed, skipping event!");
133 unsigned int nSeeds = 0;
134 for (
auto* aNode : segmentNetwork) {
135 if (m_PARAMstrictSeeding && !(aNode->getOuterNodes().empty())) {
138 if (aNode->getInnerNodes().empty()) {
143 aNode->getMetaInfo().setSeed(
true);
148 B2WARNING(
"In Event: " << m_eventCounter <<
" no seed could be found -> no TCs created!");
153 if (m_PARAMsetFamilies) {
154 unsigned short nFamilies = m_familyDefiner.defineFamilies(segmentNetwork);
155 B2DEBUG(10,
"Number of families in the network: " << nFamilies);
156 if (nFamilies > m_PARAMmaxFamilies) {
157 B2ERROR(
"Maximal number of track canidates per event was exceeded: Number of Families = " << nFamilies);
158 m_eventLevelTrackingInfo->setVXDTF2AbortionFlag();
161 m_sptcSelector->prepareSelector(nFamilies);
164 m_collectedPaths.clear();
165 if (not m_pathCollector.findPaths(segmentNetwork, m_collectedPaths, m_PARAMmaxPaths, m_PARAMstoreSubsets)) {
166 B2ERROR(
"VXDBasicPathFinder got signal to abort the event.");
167 m_eventLevelTrackingInfo->setVXDTF2AbortionFlag();
168 m_network->set_collectedPaths(m_collectedPaths.size());
172 m_network->set_collectedPaths(m_collectedPaths.size());
176 for (
auto& aPath : m_collectedPaths) {
179 if (m_PARAMselectBestPerFamily) {
180 m_sptcSelector->testNewSPTC(sptc);
182 std::vector<const SpacePoint*> path = sptc.
getHits();
183 m_sptcCreator.createSPTC(m_TCs, path, sptc.
getFamily());
188 if (m_PARAMselectBestPerFamily) {
189 std::vector<SpacePointTrackCand> bestPaths = m_sptcSelector->returnSelection();
190 for (
unsigned short iCand = 0; iCand < bestPaths.size(); iCand++) {
192 std::vector<const SpacePoint*> path = cand.
getHits();
193 m_sptcCreator.createSPTC(m_TCs, path, cand.
getFamily());