Belle II Software  release-06-02-00
SegmentNetworkProducerModule.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #include <tracking/modules/vxdtfRedesign/SegmentNetworkProducerModule.h>
10 #include <tracking/trackFindingVXD/segmentNetwork/NodeNetworkHelperFunctions.h>
11 #include <tracking/trackFindingVXD/environment/VXDTFFilters.h>
12 #include <tracking/trackFindingVXD/environment/VXDTFFiltersHelperFunctions.h>
13 
14 #include <tracking/trackFindingVXD/filterMap/filterFramework/VoidObserver.h>
15 
16 using namespace std;
17 using namespace Belle2;
18 
19 REG_MODULE(SegmentNetworkProducer)
20 
22 {
23  //Set module properties
24  setDescription("The segment network producer module. "
25  "\n This module takes a given sectorMap and storeArrays of spacePoints and creates a "
26  "activeSectorNetwork, a trackNodeNetwork and a segmentNetwork."
27  "These are filled and stored in a StoreObjPtr of DirectedNodeNetworkContainer:\n");
28  setPropertyFlags(c_ParallelProcessingCertified);
29 
30  addParam("SpacePointsArrayNames",
31  m_PARAMSpacePointsArrayNames,
32  "List of SpacePoint StoreArray names to be evaluated.",
33  m_PARAMSpacePointsArrayNames);
34 
35  addParam("NetworkOutputName",
36  m_PARAMNetworkOutputName,
37  "Unique name for the DirectedNodeNetworkContainer Store Object Pointer created and filled by this module.",
38  string(""));
39 
40  addParam("EventLevelTrackingInfoName",
41  m_PARAMEventLevelTrackingInfoName,
42  "Name of the EventLevelTrackingInfo that should be used (different one for ROI-finding).",
43  string("EventLevelTrackingInfo"));
44 
45  addParam("addVirtualIP",
46  m_PARAMAddVirtualIP,
47  "Whether to add a SpacePoint for a virtual interaction point to be considered by the network creation.",
48  m_PARAMAddVirtualIP);
49 
50  addParam("virtualIPCoorindates",
51  m_PARAMVirtualIPCoordinates,
52  "Coordinates as list [x,z,y] to be used for the virtual interaction point SpacePoint, if turned on.",
53  m_PARAMVirtualIPCoordinates);
54 
55  addParam("virtualIPErrors",
56  m_PARAMVirtualIPErrors,
57  "Errors on coordinates as list [Ex,Ez,Ey] to be used for the virtual interaction point SpacePoint, if turned on.",
58  m_PARAMVirtualIPErrors);
59 
60  addParam("sectorMapName",
61  m_PARAMsecMapName,
62  "Name of the SectorMap to be used by this instance.",
63  m_PARAMsecMapName);
64 
65  addParam("printNetworks",
66  m_PARAMprintNetworks,
67  "If true for each event and each network a file containing the networks as graphs is created.",
68  m_PARAMprintNetworks);
69 
70  addParam("printNetworkToMathematica",
71  m_PARAMprintToMathematica,
72  "If true a file containing Mathematica code to generate a graph of the segment network is created.",
73  m_PARAMprintToMathematica);
74 
75  addParam("allFiltersOff",
76  m_PARAMallFiltersOff,
77  "For debugging purposes: if true, all filters are deactivated for all hit-combinations and therefore all combinations are accepted.",
78  m_PARAMallFiltersOff);
79 
80  addParam("maxNetworkSize",
81  m_PARAMmaxNetworkSize,
82  "Maximal size of the SegmentNetwork; if exceeded, the event execution will be skipped.",
83  m_PARAMmaxNetworkSize);
84 
85  addParam("maxConnections",
86  m_PARAMmaxSegmentConnections ,
87  "Maximal number of Segment connections; if exceeded, the event execution will be skipped.",
88  m_PARAMmaxSegmentConnections);
89 
90  addParam("maxAddedConnections",
91  m_PARAMmaxSegmentAddedConnections ,
92  "Maximal number of added Segment connections; if exceeded, the event execution will be skipped.",
93  m_PARAMmaxSegmentAddedConnections);
94 
95  addParam("maxHitConnections",
96  m_PARAMmaxTrackNodeConnections,
97  "Maximal number of Hit connections; if exceeded, the event execution will be skipped.",
98  m_PARAMmaxTrackNodeConnections);
99 
100  addParam("maxAddedHitConnections",
101  m_PARAMmaxTrackNodeAddedConnections,
102  "Maximal number of added Hit connections; if exceeded, the event execution will be skipped.",
103  m_PARAMmaxTrackNodeAddedConnections);
104 }
105 
106 void SegmentNetworkProducerModule::initialize()
107 {
108  if (m_PARAMVirtualIPCoordinates.size() != 3 or m_PARAMVirtualIPErrors.size() != 3) {
109  B2FATAL("Parameters for virtualIP are wrong!");
110  }
111 
112  // Get pointer to current filters to check if they exist. They must be reloaded for every run,
113  // as the pointer will change if the DB object changes (see SectorMapBootStrapModule).
114  auto filters = m_filtersContainer.getFilters(m_PARAMsecMapName);
115  if (filters == nullptr) {
116  B2FATAL("Requested secMapName '" << m_PARAMsecMapName << "' does not exist! Can not continue...");
117  }
118 
119  m_virtualIPCoordinates = B2Vector3D(m_PARAMVirtualIPCoordinates.at(0),
120  m_PARAMVirtualIPCoordinates.at(1),
121  m_PARAMVirtualIPCoordinates.at(2));
122  m_virtualIPErrors = B2Vector3D(m_PARAMVirtualIPErrors.at(0),
123  m_PARAMVirtualIPErrors.at(1),
124  m_PARAMVirtualIPErrors.at(2));
125 
126  if (m_PARAMprintToMathematica) {
127  SecMapHelper::printStaticSectorRelations(*filters, filters->getConfig().secMapName + "segNetProducer", 2, m_PARAMprintToMathematica,
128  true);
129  }
130 
131  for (std::string& anArrayName : m_PARAMSpacePointsArrayNames) {
132  m_spacePoints.push_back(StoreArray<SpacePoint>(anArrayName));
133  m_spacePoints.back().isRequired();
134  }
135 
136  m_network.registerInDataStore(m_PARAMNetworkOutputName, DataStore::c_DontWriteOut | DataStore::c_ErrorIfAlreadyRegistered);
137 
138  m_eventLevelTrackingInfo.isRequired(m_PARAMEventLevelTrackingInfoName);
139 }
140 
141 
142 void SegmentNetworkProducerModule::event()
143 {
144  m_eventCounter++;
145 
146  if (m_vxdtfFilters == nullptr) {
147  B2FATAL("Requested secMapName '" << m_PARAMsecMapName << "' does not exist! Can not continue...");
148  }
149 
150  // make sure that network exists:
151  if (!m_network) {
152  m_network.create();
153  }
154 
155  vector<RawSectorData> collectedData = matchSpacePointToSectors();
156 
157  m_network->set_trackNodeConnections(0);
158  m_network->set_activeSectorConnections(0);
159  m_network->set_segmentConnections(0);
160  m_network->set_trackNodeAddedConnections(0);
161  m_network->set_activeSectorAddedConnections(0);
162  m_network->set_segmentAddedConnections(0);
163  m_network->set_collectedPaths(0);
164 
165 
166  buildActiveSectorNetwork(collectedData);
167 
168  if (not buildTrackNodeNetwork<VoidObserver>()) {
169  return;
170  }
171 
172  buildSegmentNetwork<VoidObserver>();
173 }
174 
175 
176 std::vector<SegmentNetworkProducerModule::RawSectorData> SegmentNetworkProducerModule::matchSpacePointToSectors()
177 {
178  std::vector<RawSectorData> collectedData; // contains the raw sectors to be activated
179  std::deque<TrackNode>& trackNodes = m_network->accessTrackNodes(); // collects trackNodes
180  int nCollected = 0;
181 
182  for (StoreArray<SpacePoint>& storeArray : m_spacePoints) {
183  // match all SpacePoints with the sectors:
184  for (SpacePoint& aSP : storeArray) {
185  if (aSP.getAssignmentState()) {
186  continue;
187  }
188 
189  const StaticSectorType* sectorFound = findSectorForSpacePoint(aSP);
190 
191  if (sectorFound == nullptr) {
192  B2WARNING("SpacePoint in sensor " << aSP.getVxdID() << " no sector found, SpacePoint discarded!");
193  continue;
194  }
195 
196  trackNodes.emplace_back(&aSP);
197 
198  // sector for SpacePoint exists:
199  FullSecID foundSecID = sectorFound->getFullSecID();
200 
201  vector<RawSectorData>::iterator iter =
202  std::find_if(collectedData.begin(), collectedData.end(),
203  [&](const RawSectorData & entry) -> bool { return entry.secID == foundSecID; }
204  );
205 
206  // if secID not in collectedData:
207  if (iter == collectedData.end()) {
208  collectedData.push_back({ foundSecID , false, nullptr, sectorFound, { & (trackNodes.back())}});
209  nCollected++;
210  } else {
211  iter->hits.push_back(&(trackNodes.back()));
212  nCollected++;
213  }
214  }
215  }
216 
217  // store IP-coordinates
218  if (m_PARAMAddVirtualIP) {
219  m_network->setVirtualInteractionPoint(m_virtualIPCoordinates, m_virtualIPErrors);
220  TrackNode* vIP = m_network->getVirtualInteractionPoint();
221  const StaticSectorType* sectorFound = findSectorForSpacePoint((vIP->getHit()));
222  collectedData.push_back({FullSecID(), false, nullptr, sectorFound, {vIP}}); // TODO: which FullSecID for the vIP?
223  }
224 
225  m_network->set_trackNodesCollected(nCollected);
226  return collectedData;
227 }
228 
229 
230 void SegmentNetworkProducerModule::buildActiveSectorNetwork(std::vector<SegmentNetworkProducerModule::RawSectorData>&
231  collectedData)
232 {
233  // access (yet) empty activeSectorNetwork:
235  m_network->accessActiveSectorNetwork();
236  // activeSectors are to be stored separately:
237  std::deque<ActiveSector<StaticSectorType, TrackNode>>& activeSectors = m_network->accessActiveSectors();
238  unsigned int nLinked = 0, nAdded = 0;
239 
240  // loop over all raw sectors found so far:
241  for (RawSectorData& outerSectorData : collectedData) {
242  ActiveSector<StaticSectorType, TrackNode> outerSector(outerSectorData.staticSector);
243  std::int32_t outerEntryID = outerSector.getID();
244 
245  // skip double-adding of nodes into the network after first time found -> speeding up the code:
246  bool wasAnythingFoundSoFar = false;
247  // find innerSectors of outerSector and add them to the network:
248  const std::vector<FullSecID>& innerSecIDs = outerSector.getInner2spSecIDs();
249 
250  for (const FullSecID& innerSecID : innerSecIDs) {
251  std::int32_t innerEntryID = innerSecID;
252  vector<RawSectorData>::iterator innerRawSecPos =
253  std::find_if(collectedData.begin(), collectedData.end(),
254  [&](const RawSectorData & entry) -> bool { return (entry.secID == innerSecID); }
255  );
256 
257  // current inner sector has no SpacePoints in this event:
258  if (innerRawSecPos == collectedData.end()) {
259  continue;
260  }
261 
262  // take care of inner sector first:
263  if (!innerRawSecPos->wasCreated) { // was already there
264  activeSectors.emplace_back(innerRawSecPos->staticSector);
265  innerRawSecPos->wasCreated = true;
266  innerRawSecPos->sector = &activeSectors.back();
267  for (Belle2::TrackNode* hit : innerRawSecPos->hits) {
268  hit->m_sector = &activeSectors.back();
269  }
270  // add all SpacePoints of this sector to ActiveSector:
271  activeSectors.back().addHits(innerRawSecPos->hits);
272  activeSectorNetwork.addNode(innerEntryID, activeSectors.back());
273  }
274 
275  // when accepting combination the first time, take care of outer sector:
276  if (!wasAnythingFoundSoFar) {
277  activeSectors.push_back(outerSector);
278  outerSectorData.wasCreated = true;
279  outerSectorData.sector = &activeSectors.back();
280  for (Belle2::TrackNode* hit : outerSectorData.hits) {
281  hit->m_sector = &activeSectors.back();
282  }
283  // add all SpacePoints of this sector to ActiveSector:
284  activeSectors.back().addHits(outerSectorData.hits);
285  activeSectorNetwork.addNode(outerEntryID, activeSectors.back());
286 
287  if (activeSectorNetwork.linkNodes(outerEntryID, innerEntryID)) {
288  wasAnythingFoundSoFar = true;
289  nLinked++;
290  nAdded++;
291  }
292  } else {
293  if (activeSectorNetwork.addInnerToLastOuterNode(innerEntryID)) {
294  nAdded++;
295  }
296  }
297  }
298  }
299 
300  m_network->set_activeSectorConnections(nLinked);
301  m_network->set_activeSectorAddedConnections(nAdded);
302 
303  if (m_PARAMprintNetworks) {
304  std::string fileName = m_vxdtfFilters->getConfig().secMapName + "_ActiveSector_Ev" + std::to_string(m_eventCounter);
305  DNN::printNetwork<ActiveSector<StaticSectorType, TrackNode>, VoidMetaInfo>(activeSectorNetwork, fileName);
306  }
307 }
308 
309 
310 template <class ObserverType>
311 bool SegmentNetworkProducerModule::buildTrackNodeNetwork()
312 {
314  m_network->accessActiveSectorNetwork();
315  DirectedNodeNetwork<Belle2::TrackNode, VoidMetaInfo>& hitNetwork = m_network->accessHitNetwork();
316 
317  unsigned int nLinked = 0, nAdded = 0;
318 
319  // loop over outer sectors to get their hits(->outerHits) and inner sectors
320  for (auto* outerSector : activeSectorNetwork.getNodes()) {
321  if (outerSector->getInnerNodes().empty()) {
322  continue;
323  }
324  const vector<TrackNode*>& outerHits = outerSector->getEntry().getHits();
325  if (outerHits.empty()) {
326  continue;
327  }
328 
329  // get the point to the static sector
330  const StaticSectorType* outerStaticSector = outerSector->getEntry().getAttachedStaticSector();
331  // should not happen, but just in case:
332  if (outerStaticSector == nullptr) {
333  B2WARNING("Static sector not found. This should not happen!");
334  continue;
335  }
336 
337  // loop over inner sectors to get their hits(->innerHits) and check their compatibility
338  for (auto* innerSector : outerSector->getInnerNodes()) {
339  const vector<TrackNode*>& innerHits = innerSector->getEntry().getHits();
340  if (innerHits.empty()) {
341  continue;
342  }
343 
344  //retrieve the filter, a null pointer is returned if there is no filter
345  const auto* filter2sp = outerStaticSector->getFilter2sp(innerSector->getEntry().getFullSecID());
346  if (filter2sp == nullptr) {
347  continue;
348  }
349 
350  for (TrackNode* outerHit : outerHits) {
351  // skip double-adding of nodes into the network after first time found -> speeding up the code:
352  bool wasAnythingFoundSoFar = false;
353 
354  std::int32_t outerNodeID = outerHit->getID();
355  hitNetwork.addNode(outerNodeID, *outerHit);
356 
357  for (TrackNode* innerHit : innerHits) {
358  // applying filters provided by the sectorMap:
359  // ->observe() gives back an observed version of the filter (the default filter has the VoidObserver)
360  bool accepted = (filter2sp->observe(ObserverType())).accept(outerHit->getHit(), innerHit->getHit());
361 
362  if (m_PARAMallFiltersOff) accepted = true; // bypass all filters
363 
364  if (!accepted) {
365  continue;
366  }
367 
368  std::int32_t innerNodeID = innerHit->getID();
369  hitNetwork.addNode(innerNodeID, *innerHit);
370  // store combination of hits in network:
371  if (!wasAnythingFoundSoFar) {
372  if (hitNetwork.linkNodes(outerNodeID, innerNodeID)) {
373  nLinked++;
374  nAdded++;
375  wasAnythingFoundSoFar = true;
376  }
377  } else {
378  if (hitNetwork.addInnerToLastOuterNode(innerNodeID)) {
379  nAdded++;
380  }
381  }
382 
383  if (nLinked > m_PARAMmaxTrackNodeConnections) {
384  B2WARNING("Number of TrackNodeConnections has exceeded maximal size limit of " << m_PARAMmaxTrackNodeConnections
385  << "! The event will be skipped and not be processed. The number of connections was = " << nLinked);
386  m_eventLevelTrackingInfo->setVXDTF2AbortionFlag();
387  m_network->set_trackNodeConnections(nLinked);
388  m_network->set_trackNodeAddedConnections(nAdded);
389  return false;
390  }
391  if (nAdded > m_PARAMmaxTrackNodeAddedConnections) {
392  B2WARNING("Number of added TrackNodeConnections has exceeded maximal size limit of " << m_PARAMmaxTrackNodeAddedConnections
393  << "! The event will be skipped and not be processed. The number of connections was = " << nAdded);
394  m_eventLevelTrackingInfo->setVXDTF2AbortionFlag();
395  m_network->set_trackNodeConnections(nLinked);
396  m_network->set_trackNodeAddedConnections(nAdded);
397  return false;
398  }
399  }
400  }
401  }
402  }
403  m_network->set_trackNodeConnections(nLinked);
404  m_network->set_trackNodeAddedConnections(nAdded);
405 
406  if (m_PARAMprintNetworks) {
407  std::string fileName = m_vxdtfFilters->getConfig().secMapName + "_TrackNode_Ev" + std::to_string(m_eventCounter);
408  DNN::printNetwork<Belle2::TrackNode, VoidMetaInfo>(hitNetwork, fileName);
409  }
410 
411  return true;
412 }
413 
414 
415 template <class ObserverType>
416 void SegmentNetworkProducerModule::buildSegmentNetwork()
417 {
418  DirectedNodeNetwork<Belle2::TrackNode, VoidMetaInfo>& hitNetwork = m_network->accessHitNetwork();
419  DirectedNodeNetwork<Segment<Belle2::TrackNode>, CACell>& segmentNetwork = m_network->accessSegmentNetwork();
420  std::deque<Belle2::Segment<Belle2::TrackNode>>& segments = m_network->accessSegments();
421  unsigned int nLinked = 0, nAdded = 0;
422 
423  for (DirectedNode<TrackNode, VoidMetaInfo>* outerHit : hitNetwork.getNodes()) {
424  const vector<DirectedNode<TrackNode, VoidMetaInfo>*>& centerHits = outerHit->getInnerNodes();
425 
426  if (centerHits.empty()) {
427  continue;
428  }
429 
430  // get the point to the static sector
431  const StaticSectorType* outerStaticSector = outerHit->getEntry().m_sector->getAttachedStaticSector();
432  // should not happen, but just in case:
433  if (outerStaticSector == nullptr) {
434  B2WARNING("Static sector not found. This should not happen!");
435  continue;
436  }
437 
438  for (DirectedNode<TrackNode, VoidMetaInfo>* centerHit : centerHits) {
439  const vector<DirectedNode<TrackNode, VoidMetaInfo>*>& innerHits = centerHit->getInnerNodes();
440  if (innerHits.empty()) {
441  continue;
442  }
443 
444  // skip double-adding of nodes into the network after first time found -> speeding up the code:
445  bool wasAnythingFoundSoFar = false;
446  for (DirectedNode<TrackNode, VoidMetaInfo>* innerHit : innerHits) {
447 
448  //retrieve the filter
449  const auto* filter3sp = outerStaticSector->getFilter3sp(centerHit->getEntry().m_sector->getFullSecID(),
450  innerHit->getEntry().m_sector->getFullSecID());
451  if (filter3sp == nullptr) {
452  continue;
453  }
454 
455  // the filter accepts spacepoint combinations
456  // ->observe gives back an observed version of the filter
457  bool accepted = false;
458  // there is an uncaught exception thrown by the CircleCenterXY filter variable if the points are on a straight line
459  try {
460  accepted = (filter3sp->observe(ObserverType())).accept(outerHit->getEntry().getHit(),
461  centerHit->getEntry().getHit(),
462  innerHit->getEntry().getHit());
463  } catch (...) {
464  B2WARNING("SegmentNetworkProducerModule: exception caught thrown by one of the three hit filters");
465  }
466 
467  if (m_PARAMallFiltersOff) accepted = true; // bypass all filters
468 
469  if (!accepted) {
470  continue;
471  }
472 
473  std::int64_t innerSegmentID = static_cast<std::int64_t>(centerHit->getEntry().getID()) << 32 | static_cast<std::int64_t>
474  (innerHit->getEntry().getID());
475 
476  if (not segmentNetwork.isNodeInNetwork(innerSegmentID)) {
477  // create innerSegment first (order of storage in vector<segments> is irrelevant):
478  segments.emplace_back(centerHit->getEntry().m_sector->getFullSecID(),
479  innerHit->getEntry().m_sector->getFullSecID(),
480  &centerHit->getEntry(),
481  &innerHit->getEntry());
482  segmentNetwork.addNode(innerSegmentID, segments.back());
483  }
484 
485  std::int64_t outerSegmentID = static_cast<std::int64_t>(outerHit->getEntry().getID()) << 32 | static_cast<std::int64_t>
486  (centerHit->getEntry().getID());
487  if (not segmentNetwork.isNodeInNetwork(outerSegmentID)) {
488  segments.emplace_back(outerHit->getEntry().m_sector->getFullSecID(),
489  centerHit->getEntry().m_sector->getFullSecID(),
490  &outerHit->getEntry(),
491  &centerHit->getEntry());
492  segmentNetwork.addNode(outerSegmentID, segments.back());
493  }
494 
495  // store combination of hits in network:
496  if (!wasAnythingFoundSoFar) {
497  if (segmentNetwork.linkNodes(outerSegmentID, innerSegmentID)) {
498  nLinked++;
499  nAdded++;
500  wasAnythingFoundSoFar = true;
501  }
502  } else {
503  if (segmentNetwork.addInnerToLastOuterNode(innerSegmentID)) {
504  nAdded++;
505  }
506  }
507 
508  if (nLinked > m_PARAMmaxSegmentConnections) {
509  B2WARNING("Number of SegmentConnections exceeds the limit of " << m_PARAMmaxSegmentConnections
510  << ". VXDTF2 will skip the event and the SegmentNetwork is cleared.");
511  m_eventLevelTrackingInfo->setVXDTF2AbortionFlag();
512  m_network->set_segmentConnections(nLinked);
513  m_network->set_segmentAddedConnections(nAdded);
514  m_network->clear();
515  return;
516  }
517  if (nAdded > m_PARAMmaxSegmentAddedConnections) {
518  B2WARNING("Number of added SegmentConnections exceeds the limit of " << m_PARAMmaxSegmentAddedConnections
519  << ". VXDTF2 will skip the event and the SegmentNetwork is cleared.");
520  m_eventLevelTrackingInfo->setVXDTF2AbortionFlag();
521  m_network->set_segmentConnections(nLinked);
522  m_network->set_segmentAddedConnections(nAdded);
523  m_network->clear();
524  return;
525  }
526  if (segments.size() > m_PARAMmaxNetworkSize) {
527  B2WARNING("SegmentNetwork size exceeds the limit of " << m_PARAMmaxNetworkSize
528  << ". Network size is " << segmentNetwork.size()
529  << ". VXDTF2 will skip the event and the SegmentNetwork is cleared.");
530  m_eventLevelTrackingInfo->setVXDTF2AbortionFlag();
531  m_network->set_segmentConnections(nLinked);
532  m_network->set_segmentAddedConnections(nAdded);
533  m_network->clear();
534  return;
535  }
536  }
537  }
538  }
539  m_network->set_segmentConnections(nLinked);
540  m_network->set_segmentAddedConnections(nAdded);
541 
542  if (m_PARAMprintNetworks) {
543  std::string fileName = m_vxdtfFilters->getConfig().secMapName + "_Segment_Ev" + std::to_string(m_eventCounter);
544  DNN::printNetwork<Segment<Belle2::TrackNode>, CACell>(segmentNetwork, fileName);
545  DNN::printCANetwork<Segment<Belle2::TrackNode>>(segmentNetwork, "CA" + fileName);
546  }
547 }
The ActiveSector Class.
Definition: ActiveSector.h:29
std::int32_t getID() const
************************* PUBLIC MEMBER FUNCTIONS *************************
Definition: ActiveSector.h:82
const std::vector< FullSecID > & getInner2spSecIDs() const
returns all IDs for inner sectors of two-sector-combinations stored in the static SectorMap
Definition: ActiveSector.h:98
The CACell class This Class stores all relevant information one wants to have stored in a cell for a ...
Definition: CACell.h:20
Network of directed nodes of the type EntryType.
std::vector< Node * > & getNodes()
Returns all nodes of the network.
bool addInnerToLastOuterNode(NodeID innerNodeID)
to the last outerNode added, another innerNode will be attached
unsigned int size() const
Returns number of nodes to be found in the network.
bool linkNodes(NodeID outerNodeID, NodeID innerNodeID)
takes two entry IDs and weaves them into the network
bool isNodeInNetwork(const NodeID nodeID) const
Check if a given entry is already in the network.
bool addNode(NodeID nodeID, EntryType &newEntry)
************************* PUBLIC MEMBER FUNCTIONS *************************
The Node-Class.
Definition: DirectedNode.h:31
Class to identify a sector inside of the VXD.
Definition: FullSecID.h:33
Base class for Modules.
Definition: Module.h:72
The Segment Network Producer Module.
SpacePoint typically is build from 1 PXDCluster or 1-2 SVDClusters.
Definition: SpacePoint.h:42
class to describe a static sector of the sector map.
Definition: StaticSector.h:29
FullSecID getFullSecID() const
returns FullSecID of this sector
Definition: StaticSector.h:173
const Filter3sp * getFilter3sp(const FullSecID &centerID, const FullSecID &innerID) const
Get the pionter to the 3 Space Point filter assigned to the friendship relation among this sector; wi...
Definition: StaticSector.h:69
const Filter2sp * getFilter2sp(FullSecID innerSector) const
Get the pionter to the 2 Space Point filter assigned to the friendship relation among this sector; wi...
Definition: StaticSector.h:56
The most CPU efficient MetaInfo for the DirectedNode-requirements (even if useless).
Definition: VoidMetaInfo.h:17
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:650
B2Vector3< double > B2Vector3D
typedef for common usage with double
Definition: B2Vector3.h:493
Abstract base class for different kinds of events.
Simple struct for collecting raw data for a single sector.
Minimal class to store combination of sector and spacePoint, since SpacePoint can not carry sectorCon...
Definition: TrackNode.h:22
const SpacePoint & getHit() const
returns reference to hit.
Definition: TrackNode.h:92