11 #include <tracking/modules/vxdtfRedesign/SegmentNetworkProducerModule.h>
12 #include <tracking/trackFindingVXD/segmentNetwork/NodeNetworkHelperFunctions.h>
13 #include <tracking/trackFindingVXD/environment/VXDTFFilters.h>
14 #include <tracking/trackFindingVXD/environment/VXDTFFiltersHelperFunctions.h>
16 #include <tracking/trackFindingVXD/filterMap/filterFramework/VoidObserver.h>
26 setDescription(
"The segment network producer module. "
27 "\n This module takes a given sectorMap and storeArrays of spacePoints and creates a "
28 "activeSectorNetwork, a trackNodeNetwork and a segmentNetwork."
29 "These are filled and stored in a StoreObjPtr of DirectedNodeNetworkContainer:\n");
30 setPropertyFlags(c_ParallelProcessingCertified);
32 addParam(
"SpacePointsArrayNames",
33 m_PARAMSpacePointsArrayNames,
34 "List of SpacePoint StoreArray names to be evaluated.",
35 m_PARAMSpacePointsArrayNames);
37 addParam(
"NetworkOutputName",
38 m_PARAMNetworkOutputName,
39 "Unique name for the DirectedNodeNetworkContainer Store Object Pointer created and filled by this module.",
42 addParam(
"EventLevelTrackingInfoName",
43 m_PARAMEventLevelTrackingInfoName,
44 "Name of the EventLevelTrackingInfo that should be used (different one for ROI-finding).",
45 string(
"EventLevelTrackingInfo"));
47 addParam(
"addVirtualIP",
49 "Whether to add a SpacePoint for a virtual interaction point to be considered by the network creation.",
52 addParam(
"virtualIPCoorindates",
53 m_PARAMVirtualIPCoordinates,
54 "Coordinates as list [x,z,y] to be used for the virtual interaction point SpacePoint, if turned on.",
55 m_PARAMVirtualIPCoordinates);
57 addParam(
"virtualIPErrors",
58 m_PARAMVirtualIPErrors,
59 "Errors on coordinates as list [Ex,Ez,Ey] to be used for the virtual interaction point SpacePoint, if turned on.",
60 m_PARAMVirtualIPErrors);
62 addParam(
"sectorMapName",
64 "Name of the SectorMap to be used by this instance.",
67 addParam(
"printNetworks",
69 "If true for each event and each network a file containing the networks as graphs is created.",
70 m_PARAMprintNetworks);
72 addParam(
"printNetworkToMathematica",
73 m_PARAMprintToMathematica,
74 "If true a file containing Mathematica code to generate a graph of the segment network is created.",
75 m_PARAMprintToMathematica);
77 addParam(
"allFiltersOff",
79 "For debugging purposes: if true, all filters are deactivated for all hit-combinations and therefore all combinations are accepted.",
80 m_PARAMallFiltersOff);
82 addParam(
"maxNetworkSize",
83 m_PARAMmaxNetworkSize,
84 "Maximal size of the SegmentNetwork; if exceeded, the event execution will be skipped.",
85 m_PARAMmaxNetworkSize);
87 addParam(
"maxConnections",
88 m_PARAMmaxSegmentConnections ,
89 "Maximal number of Segment connections; if exceeded, the event execution will be skipped.",
90 m_PARAMmaxSegmentConnections);
92 addParam(
"maxAddedConnections",
93 m_PARAMmaxSegmentAddedConnections ,
94 "Maximal number of added Segment connections; if exceeded, the event execution will be skipped.",
95 m_PARAMmaxSegmentAddedConnections);
97 addParam(
"maxHitConnections",
98 m_PARAMmaxTrackNodeConnections,
99 "Maximal number of Hit connections; if exceeded, the event execution will be skipped.",
100 m_PARAMmaxTrackNodeConnections);
102 addParam(
"maxAddedHitConnections",
103 m_PARAMmaxTrackNodeAddedConnections,
104 "Maximal number of added Hit connections; if exceeded, the event execution will be skipped.",
105 m_PARAMmaxTrackNodeAddedConnections);
108 void SegmentNetworkProducerModule::initialize()
110 if (m_PARAMVirtualIPCoordinates.size() != 3 or m_PARAMVirtualIPErrors.size() != 3) {
111 B2FATAL(
"Parameters for virtualIP are wrong!");
116 auto filters = m_filtersContainer.getFilters(m_PARAMsecMapName);
117 if (filters ==
nullptr) {
118 B2FATAL(
"Requested secMapName '" << m_PARAMsecMapName <<
"' does not exist! Can not continue...");
121 m_virtualIPCoordinates =
B2Vector3D(m_PARAMVirtualIPCoordinates.at(0),
122 m_PARAMVirtualIPCoordinates.at(1),
123 m_PARAMVirtualIPCoordinates.at(2));
124 m_virtualIPErrors =
B2Vector3D(m_PARAMVirtualIPErrors.at(0),
125 m_PARAMVirtualIPErrors.at(1),
126 m_PARAMVirtualIPErrors.at(2));
128 if (m_PARAMprintToMathematica) {
129 SecMapHelper::printStaticSectorRelations(*filters, filters->getConfig().secMapName +
"segNetProducer", 2, m_PARAMprintToMathematica,
133 for (std::string& anArrayName : m_PARAMSpacePointsArrayNames) {
135 m_spacePoints.back().isRequired();
138 m_network.registerInDataStore(m_PARAMNetworkOutputName, DataStore::c_DontWriteOut | DataStore::c_ErrorIfAlreadyRegistered);
140 m_eventLevelTrackingInfo.isRequired(m_PARAMEventLevelTrackingInfoName);
144 void SegmentNetworkProducerModule::event()
148 if (m_vxdtfFilters ==
nullptr) {
149 B2FATAL(
"Requested secMapName '" << m_PARAMsecMapName <<
"' does not exist! Can not continue...");
157 vector<RawSectorData> collectedData = matchSpacePointToSectors();
159 m_network->set_trackNodeConnections(0);
160 m_network->set_activeSectorConnections(0);
161 m_network->set_segmentConnections(0);
162 m_network->set_trackNodeAddedConnections(0);
163 m_network->set_activeSectorAddedConnections(0);
164 m_network->set_segmentAddedConnections(0);
165 m_network->set_collectedPaths(0);
168 buildActiveSectorNetwork(collectedData);
170 if (not buildTrackNodeNetwork<VoidObserver>()) {
174 buildSegmentNetwork<VoidObserver>();
178 std::vector<SegmentNetworkProducerModule::RawSectorData> SegmentNetworkProducerModule::matchSpacePointToSectors()
180 std::vector<RawSectorData> collectedData;
181 std::deque<TrackNode>& trackNodes = m_network->accessTrackNodes();
187 if (aSP.getAssignmentState()) {
193 if (sectorFound ==
nullptr) {
194 B2WARNING(
"SpacePoint in sensor " << aSP.getVxdID() <<
" no sector found, SpacePoint discarded!");
198 trackNodes.emplace_back(&aSP);
203 vector<RawSectorData>::iterator iter =
204 std::find_if(collectedData.begin(), collectedData.end(),
205 [&](
const RawSectorData & entry) ->
bool { return entry.secID == foundSecID; }
209 if (iter == collectedData.end()) {
210 collectedData.push_back({ foundSecID ,
false,
nullptr, sectorFound, { & (trackNodes.back())}});
213 iter->hits.push_back(&(trackNodes.back()));
220 if (m_PARAMAddVirtualIP) {
221 m_network->setVirtualInteractionPoint(m_virtualIPCoordinates, m_virtualIPErrors);
222 TrackNode* vIP = m_network->getVirtualInteractionPoint();
224 collectedData.push_back({
FullSecID(),
false,
nullptr, sectorFound, {vIP}});
227 m_network->set_trackNodesCollected(nCollected);
228 return collectedData;
232 void SegmentNetworkProducerModule::buildActiveSectorNetwork(std::vector<SegmentNetworkProducerModule::RawSectorData>&
237 m_network->accessActiveSectorNetwork();
239 std::deque<ActiveSector<StaticSectorType, TrackNode>>& activeSectors = m_network->accessActiveSectors();
240 unsigned int nLinked = 0, nAdded = 0;
245 std::int32_t outerEntryID = outerSector.
getID();
248 bool wasAnythingFoundSoFar =
false;
252 for (
const FullSecID innerSecID : innerSecIDs) {
253 std::int32_t innerEntryID = innerSecID;
254 vector<RawSectorData>::iterator innerRawSecPos =
255 std::find_if(collectedData.begin(), collectedData.end(),
256 [&](
const RawSectorData & entry) ->
bool { return (entry.secID == innerSecID); }
260 if (innerRawSecPos == collectedData.end()) {
265 if (!innerRawSecPos->wasCreated) {
266 activeSectors.emplace_back(innerRawSecPos->staticSector);
267 innerRawSecPos->wasCreated =
true;
268 innerRawSecPos->sector = &activeSectors.back();
270 hit->m_sector = &activeSectors.back();
273 activeSectors.back().addHits(innerRawSecPos->hits);
274 activeSectorNetwork.
addNode(innerEntryID, activeSectors.back());
278 if (!wasAnythingFoundSoFar) {
279 activeSectors.push_back(outerSector);
280 outerSectorData.wasCreated =
true;
281 outerSectorData.sector = &activeSectors.back();
283 hit->m_sector = &activeSectors.back();
286 activeSectors.back().addHits(outerSectorData.hits);
287 activeSectorNetwork.
addNode(outerEntryID, activeSectors.back());
289 if (activeSectorNetwork.
linkNodes(outerEntryID, innerEntryID)) {
290 wasAnythingFoundSoFar =
true;
302 m_network->set_activeSectorConnections(nLinked);
303 m_network->set_activeSectorAddedConnections(nAdded);
305 if (m_PARAMprintNetworks) {
306 std::string fileName = m_vxdtfFilters->getConfig().secMapName +
"_ActiveSector_Ev" + std::to_string(m_eventCounter);
307 DNN::printNetwork<ActiveSector<StaticSectorType, TrackNode>,
VoidMetaInfo>(activeSectorNetwork, fileName);
312 template <
class ObserverType>
313 bool SegmentNetworkProducerModule::buildTrackNodeNetwork()
316 m_network->accessActiveSectorNetwork();
319 unsigned int nLinked = 0, nAdded = 0;
322 for (
auto* outerSector : activeSectorNetwork.
getNodes()) {
323 if (outerSector->getInnerNodes().empty()) {
326 const vector<TrackNode*>& outerHits = outerSector->getEntry().getHits();
327 if (outerHits.empty()) {
332 const StaticSectorType* outerStaticSector = outerSector->getEntry().getAttachedStaticSector();
334 if (outerStaticSector ==
nullptr) {
335 B2WARNING(
"Static sector not found. This should not happen!");
340 for (
auto* innerSector : outerSector->getInnerNodes()) {
341 const vector<TrackNode*>& innerHits = innerSector->getEntry().getHits();
342 if (innerHits.empty()) {
347 const auto* filter2sp = outerStaticSector->
getFilter2sp(innerSector->getEntry().getFullSecID());
348 if (filter2sp ==
nullptr) {
354 bool wasAnythingFoundSoFar =
false;
356 std::int32_t outerNodeID = outerHit->getID();
357 hitNetwork.
addNode(outerNodeID, *outerHit);
362 bool accepted = (filter2sp->observe(ObserverType())).accept(outerHit->getHit(), innerHit->getHit());
364 if (m_PARAMallFiltersOff) accepted =
true;
370 std::int32_t innerNodeID = innerHit->getID();
371 hitNetwork.
addNode(innerNodeID, *innerHit);
373 if (!wasAnythingFoundSoFar) {
374 if (hitNetwork.
linkNodes(outerNodeID, innerNodeID)) {
377 wasAnythingFoundSoFar =
true;
385 if (nLinked > m_PARAMmaxTrackNodeConnections) {
386 B2WARNING(
"Number of TrackNodeConnections has exceeded maximal size limit of " << m_PARAMmaxTrackNodeConnections
387 <<
"! Processing of the event will be aborted. The number of connections was = " << nLinked);
388 m_eventLevelTrackingInfo->setVXDTF2AbortionFlag();
389 m_network->set_trackNodeConnections(nLinked);
390 m_network->set_trackNodeAddedConnections(nAdded);
393 if (nAdded > m_PARAMmaxTrackNodeAddedConnections) {
394 B2WARNING(
"Number of added TrackNodeConnections has exceeded maximal size limit of " << m_PARAMmaxTrackNodeAddedConnections
395 <<
"! Processing of the event will be aborted. The number of connections was = " << nLinked);
396 m_eventLevelTrackingInfo->setVXDTF2AbortionFlag();
397 m_network->set_trackNodeConnections(nLinked);
398 m_network->set_trackNodeAddedConnections(nAdded);
405 m_network->set_trackNodeConnections(nLinked);
406 m_network->set_trackNodeAddedConnections(nAdded);
408 if (m_PARAMprintNetworks) {
409 std::string fileName = m_vxdtfFilters->getConfig().secMapName +
"_TrackNode_Ev" + std::to_string(m_eventCounter);
410 DNN::printNetwork<Belle2::TrackNode, VoidMetaInfo>(hitNetwork, fileName);
417 template <
class ObserverType>
418 void SegmentNetworkProducerModule::buildSegmentNetwork()
422 std::deque<Belle2::Segment<Belle2::TrackNode>>& segments = m_network->accessSegments();
423 unsigned int nLinked = 0, nAdded = 0;
426 const vector<DirectedNode<TrackNode, VoidMetaInfo>*>& centerHits = outerHit->getInnerNodes();
428 if (centerHits.empty()) {
433 const StaticSectorType* outerStaticSector = outerHit->getEntry().m_sector->getAttachedStaticSector();
435 if (outerStaticSector ==
nullptr) {
436 B2WARNING(
"Static sector not found. This should not happen!");
441 const vector<DirectedNode<TrackNode, VoidMetaInfo>*>& innerHits = centerHit->getInnerNodes();
442 if (innerHits.empty()) {
447 bool wasAnythingFoundSoFar =
false;
451 const auto* filter3sp = outerStaticSector->
getFilter3sp(centerHit->getEntry().m_sector->getFullSecID(),
452 innerHit->getEntry().m_sector->getFullSecID());
453 if (filter3sp ==
nullptr) {
459 bool accepted =
false;
462 accepted = (filter3sp->observe(ObserverType())).accept(outerHit->getEntry().getHit(),
463 centerHit->getEntry().getHit(),
464 innerHit->getEntry().getHit());
466 B2WARNING(
"SegmentNetworkProducerModule: exception caught thrown by one of the three hit filters");
469 if (m_PARAMallFiltersOff) accepted =
true;
475 std::int64_t innerSegmentID =
static_cast<std::int64_t
>(centerHit->getEntry().getID()) << 32 |
static_cast<std::int64_t
>
476 (innerHit->getEntry().getID());
480 segments.emplace_back(centerHit->getEntry().m_sector->getFullSecID(),
481 innerHit->getEntry().m_sector->getFullSecID(),
482 ¢erHit->getEntry(),
483 &innerHit->getEntry());
484 segmentNetwork.
addNode(innerSegmentID, segments.back());
487 std::int64_t outerSegmentID =
static_cast<std::int64_t
>(outerHit->getEntry().getID()) << 32 |
static_cast<std::int64_t
>
488 (centerHit->getEntry().getID());
490 segments.emplace_back(outerHit->getEntry().m_sector->getFullSecID(),
491 centerHit->getEntry().m_sector->getFullSecID(),
492 &outerHit->getEntry(),
493 ¢erHit->getEntry());
494 segmentNetwork.
addNode(outerSegmentID, segments.back());
498 if (!wasAnythingFoundSoFar) {
499 if (segmentNetwork.
linkNodes(outerSegmentID, innerSegmentID)) {
502 wasAnythingFoundSoFar =
true;
510 if (nLinked > m_PARAMmaxSegmentConnections) {
511 B2WARNING(
"Number of SegmentConnections exceeds the limit of " << m_PARAMmaxSegmentConnections
512 <<
". VXDTF2 will abort the processing ot the event and the SegmentNetwork is cleared.");
513 m_eventLevelTrackingInfo->setVXDTF2AbortionFlag();
514 m_network->set_segmentConnections(nLinked);
515 m_network->set_segmentAddedConnections(nAdded);
519 if (nAdded > m_PARAMmaxSegmentAddedConnections) {
520 B2WARNING(
"Number of added SegmentConnections exceeds the limit of " << m_PARAMmaxSegmentAddedConnections
521 <<
". VXDTF2 will abort the processing ot the event and the SegmentNetwork is cleared.");
522 m_eventLevelTrackingInfo->setVXDTF2AbortionFlag();
523 m_network->set_segmentConnections(nLinked);
524 m_network->set_segmentAddedConnections(nAdded);
528 if (segments.size() > m_PARAMmaxNetworkSize) {
529 B2WARNING(
"SegmentNetwork size exceeds the limit of " << m_PARAMmaxNetworkSize
530 <<
". Network size is " << segmentNetwork.
size()
531 <<
". VXDTF2 will abort the processing ot the event and the SegmentNetwork is cleared.");
532 m_eventLevelTrackingInfo->setVXDTF2AbortionFlag();
533 m_network->set_segmentConnections(nLinked);
534 m_network->set_segmentAddedConnections(nAdded);
541 m_network->set_segmentConnections(nLinked);
542 m_network->set_segmentAddedConnections(nAdded);
544 if (m_PARAMprintNetworks) {
545 std::string fileName = m_vxdtfFilters->getConfig().secMapName +
"_Segment_Ev" + std::to_string(m_eventCounter);
546 DNN::printNetwork<Segment<Belle2::TrackNode>,
CACell>(segmentNetwork, fileName);
547 DNN::printCANetwork<Segment<Belle2::TrackNode>>(segmentNetwork,
"CA" + fileName);