11 #include <gtest/gtest.h>
13 #include <tracking/trackFindingVXD/segmentNetwork/DirectedNode.h>
14 #include <tracking/trackFindingVXD/segmentNetwork/DirectedNodeNetwork.h>
15 #include <tracking/trackFindingVXD/segmentNetwork/DirectedNodeNetworkContainer.h>
17 #include <vxd/geometry/SensorInfoBase.h>
18 #include <pxd/dataobjects/PXDCluster.h>
19 #include <framework/datastore/StoreArray.h>
20 #include <framework/datastore/StoreObjPtr.h>
21 #include <tracking/spacePointCreation/SpacePoint.h>
22 #include <tracking/spacePointCreation/SpacePointTrackCand.h>
45 VXD::SensorInfoBase sensorInfoBase(VXD::SensorInfoBase::PXD, aVxdID, 2.3, 4.2, 0.3, 2, 4, -1);
48 r1.SetAngles(45, 20, 30);
49 TGeoTranslation t1(globalX, globalY, globalZ);
50 TGeoCombiTrans c1(t1, r1);
51 TGeoHMatrix transform = c1;
54 return sensorInfoBase;
59 PXDCluster providePXDCluster(
double u,
double v,
VxdID aVxdID,
double uError = 0.1,
double vError = 0.1)
61 return PXDCluster(aVxdID, u, v, uError, vError, 0, 0, 1, 1, 1, 1 , 1, 1);
74 DataStore::Instance().setInitializeActive(
true);
76 m_spacePointData.registerInDataStore();
77 m_pxdClusterData.registerInDataStore();
78 m_spacePointTrackCandData.registerInDataStore();
80 m_spacePointData.registerRelationTo(m_pxdClusterData);
82 m_networkContainerInDataStore.registerInDataStore();
85 DataStore::Instance().setInitializeActive(
false);
87 unsigned int nHits = 5;
90 for (
unsigned int i = 1; i <= nHits; ++i) {
94 VXD::SensorInfoBase aSensorInfo = provideSensorInfo(aVxdID, (
unsigned short)i, (
unsigned short)i + 1., (
unsigned short)i + 2.);
96 const PXDCluster* pxdCluster = m_pxdClusterData.appendNew(providePXDCluster(
float(i) /
float(nHits),
float(i) /
float(nHits),
99 SpacePoint* newSP = m_spacePointData.appendNew(pxdCluster, &aSensorInfo);
100 B2DEBUG(10,
" setup: new spacePoint got arrayIndex: " << newSP->
getArrayIndex() <<
" and VxdID " << newSP->
getVxdID());
104 B2DEBUG(10,
"DirectedNodeNetworkTest:SetUP: created " << m_pxdClusterData.getEntries() <<
"/" << m_spacePointData.getEntries() <<
105 " pxdClusters/SpacePoints");
108 vector<SpacePoint*> allSpacePoints;
110 allSpacePoints.push_back(&aSP);
113 vector<const SpacePoint*> sps4TC1 = { allSpacePoints.at(0), allSpacePoints.at(1)};
117 vector<const SpacePoint*> sps4TC2 = { allSpacePoints.at(2), allSpacePoints.at(3)};
121 vector<const SpacePoint*> sps4TC3 = { allSpacePoints.at(3), allSpacePoints.at(4)};
125 vector<const SpacePoint*> sps4TC4 = { allSpacePoints.at(4)};
129 vector<const SpacePoint*> sps4TC5 = { allSpacePoints.at(2), allSpacePoints.at(4)};
135 virtual void TearDown() { DataStore::Instance().reset(); }
150 EXPECT_EQ(5, m_pxdClusterData.getEntries());
151 EXPECT_EQ(5, m_spacePointData.getEntries());
152 EXPECT_EQ(m_pxdClusterData.getEntries(), m_spacePointData.getEntries());
153 EXPECT_EQ(5, m_spacePointTrackCandData.getEntries());
171 if (node->getEntry() == otherNode->getEntry()) {
return true; }
177 auto printNodeEntries = [&](std::vector<DirectedNode<int, VoidMetaInfo>*>& nodes) -> std::string {
178 std::string output =
"Nodes got the following entries: ";
181 output += std::to_string(node->getEntry()) +
" ";
183 return output +
"\n";
187 std::array<int, 5> intArray = { { 2, 5, 3, 4, 99} };
188 std::array<int, 5> intArray2 = { { 144, 121, 33, 35, 31415} };
189 std::array<int, 5> intArray3 = { { 1440, 1210, 3, 33, 3141529} };
190 std::deque<int> onTheFlyCreatedInts;
191 EXPECT_EQ(5, intArray.size());
194 EXPECT_EQ(0, intNetwork.
size());
195 B2INFO(
"tests case when both nodes are new and when inner one is new, but outer one not");
196 for (
unsigned int index = 1 ; index < 5; index++) {
197 B2INFO(
"intArray-index " << index <<
" of array has entry: " << intArray.at(index));
199 intNetwork.
addNode(intArray.at(index - 1), intArray.at(index - 1));
200 intNetwork.
addNode(intArray.at(index), intArray.at(index));
202 intNetwork.
linkNodes(intArray.at(index - 1), intArray.at(index));
205 EXPECT_EQ(intArray.at(index), intNetwork.
getInnerEnds().at(0)->getEntry());
208 EXPECT_EQ(intArray.at(index - 1), *intNetwork.
getNode(intArray.at(index - 1)));
209 EXPECT_EQ(intArray.at(index), *intNetwork.
getNode(intArray.at(index)));
214 EXPECT_EQ(1, innerNodes.size());
215 EXPECT_EQ(1, outerNodes.size());
218 EXPECT_EQ(*(innerNodes.at(0)), *(intNetwork.
getNode(intArray.at(index))));
224 EXPECT_EQ(intArray.size(), intNetwork.
size());
225 std::vector<DirectedNode<int, VoidMetaInfo>*> outerEnds_before = intNetwork.
getOuterEnds();
226 std::vector<DirectedNode<int, VoidMetaInfo>*> innerEnds_before = intNetwork.
getInnerEnds();
227 EXPECT_EQ(1, outerEnds_before.size());
228 EXPECT_EQ(1, innerEnds_before.size());
231 EXPECT_EQ(intArray.at(0), outermostNode->
getEntry());
232 EXPECT_EQ(outermostNode->
getEntry(), *outermostNode);
233 EXPECT_EQ(intArray.at(1), *(outermostNode->
getInnerNodes().at(0)));
236 EXPECT_EQ(intArray.at(4), innermostNode->
getEntry());
237 EXPECT_EQ(innermostNode->
getEntry(), *innermostNode);
238 EXPECT_EQ(intArray.at(3), *(innermostNode->
getOuterNodes().at(0)));
242 B2INFO(
"building another path, which is independent of the first one:");
243 for (
unsigned int index = 1 ; index < 5; index++) {
244 B2INFO(
"intArray2-index " << index <<
" of array has entry: " << intArray2.at(index));
246 intNetwork.
addNode(intArray2.at(index - 1), intArray2.at(index - 1));
247 intNetwork.
addNode(intArray2.at(index), intArray2.at(index));
249 intNetwork.
linkNodes(intArray2.at(index - 1), intArray2.at(index));
252 EXPECT_EQ(intArray2.at(index - 1), *intNetwork.
getNode(intArray2.at(index - 1)));
253 EXPECT_EQ(intArray2.at(index), *intNetwork.
getNode(intArray2.at(index)));
258 EXPECT_EQ(1, innerNodes.size());
259 EXPECT_EQ(1, outerNodes.size());
262 EXPECT_TRUE(nodeWasFound(innerNodes, intNetwork.
getNode(intArray2.at(index))));
263 EXPECT_EQ(*(innerNodes.at(0)), *(intNetwork.
getNode(intArray2.at(index))));
269 EXPECT_EQ(10, intNetwork.
size());
270 std::vector<DirectedNode<int, VoidMetaInfo>*> outerEnds = intNetwork.
getOuterEnds();
271 std::vector<DirectedNode<int, VoidMetaInfo>*> innerEnds = intNetwork.
getInnerEnds();
272 EXPECT_EQ(2, outerEnds.size());
273 EXPECT_EQ(2, innerEnds.size());
277 B2INFO(
"building another path into the network which crosses the other paths:"); {
278 B2INFO(
"tests cases: both new, outer new but inner not, inner new but outer not, both already existing:");
279 for (
unsigned int index = 1 ; index < 5; index++) {
280 B2INFO(
"intArray3-indices " << index - 1 <<
"/" << index <<
281 " of array have entries: " << intArray3.at(index - 1) <<
"/" << intArray3.at(index) <<
"\n"
284 intNetwork.
addNode(intArray3.at(index - 1), intArray3.at(index - 1));
285 intNetwork.
addNode(intArray3.at(index), intArray3.at(index));
287 intNetwork.
linkNodes(intArray3.at(index - 1), intArray3.at(index));
290 EXPECT_EQ(intArray3.at(index - 1), *intNetwork.
getNode(intArray3.at(index - 1)));
291 EXPECT_EQ(intArray3.at(index), *intNetwork.
getNode(intArray3.at(index)));
295 intNetwork.
getNode(intArray3.at(index))));
298 if (index > 1)
continue;
300 std::vector<DirectedNode<int, VoidMetaInfo>*> innerEnds = intNetwork.
getInnerEnds();
301 EXPECT_TRUE(nodeWasFound(innerEnds, intNetwork.
getNode(intArray3.at(index))));
302 B2INFO(
"innerEnds after indices " << index - 1 <<
"/" << index <<
" are: " << printNodeEntries(innerEnds));
307 EXPECT_EQ(1, innerNodes.size());
308 EXPECT_EQ(1, outerNodes.size());
314 EXPECT_EQ(13, intNetwork.
size());
316 std::vector<DirectedNode<int, VoidMetaInfo>*> outerEnds = intNetwork.
getOuterEnds();
317 std::vector<DirectedNode<int, VoidMetaInfo>*> innerEnds = intNetwork.
getInnerEnds();
318 EXPECT_EQ(3, outerEnds.size());
319 EXPECT_EQ(3, innerEnds.size());
320 B2INFO(
"outerEnds are: \n" << printNodeEntries(outerEnds));
321 B2INFO(
"innerEnds are: \n" << printNodeEntries(innerEnds));
324 B2INFO(
"case: when outer node is new, but inner one not: "); {
325 B2INFO(
" case: inner one was outer end before: ");
326 auto* oldOuterMostNode = intNetwork.
getOuterEnds().at(0);
327 int oldOuterInt = oldOuterMostNode->getEntry();
328 onTheFlyCreatedInts.push_back(42);
329 int& newInnerInt = onTheFlyCreatedInts.back();
330 EXPECT_TRUE(NULL == intNetwork.
getNode(newInnerInt));
331 intNetwork.
addNode(newInnerInt, newInnerInt);
332 intNetwork.
linkNodes(newInnerInt, oldOuterInt);
333 EXPECT_FALSE(NULL == intNetwork.
getNode(newInnerInt));
334 EXPECT_EQ(14, intNetwork.
size());
336 std::vector<DirectedNode<int, VoidMetaInfo>*> newOuterEnds = intNetwork.
getOuterEnds();
337 EXPECT_EQ(3, newOuterEnds.size());
338 EXPECT_EQ(1, oldOuterMostNode->getOuterNodes().size());
339 EXPECT_EQ(newInnerInt, *(oldOuterMostNode->getOuterNodes().at(0)));
343 B2INFO(
" case: inner one was no outer end before: ");
344 onTheFlyCreatedInts.push_back(23);
345 int& newOuterInt = onTheFlyCreatedInts.back();
346 int& existingInt = intArray.at(1);
347 std::vector<DirectedNode<int, VoidMetaInfo>*> oldOuterEnds = intNetwork.
getOuterEnds();
348 std::vector<DirectedNode<int, VoidMetaInfo>*> oldInnerEnds = intNetwork.
getInnerEnds();
350 EXPECT_EQ(3, oldOuterEnds.size());
351 EXPECT_TRUE(NULL == intNetwork.
getNode(newOuterInt));
352 unsigned int sizeB4 = intNetwork.
size();
353 intNetwork.
addNode(newOuterInt, newOuterInt);
354 intNetwork.
linkNodes(newOuterInt, existingInt);
355 EXPECT_FALSE(NULL == intNetwork.
getNode(newOuterInt));
356 EXPECT_EQ(sizeB4 + 1, intNetwork.
size());
361 std::vector<DirectedNode<int, VoidMetaInfo>*> newOuterEnds = intNetwork.
getOuterEnds();
362 EXPECT_EQ(4, newOuterEnds.size());
369 B2INFO(
"case: when both were there, but not linked yet: ");
370 unsigned int sizeB4 = intNetwork.
size();
371 intNetwork.
linkNodes(intArray.at(0), intArray.at(2));
372 EXPECT_EQ(sizeB4, intNetwork.
size());
375 std::vector<DirectedNode<int, VoidMetaInfo>*> innerEnds = intNetwork.
getNode(intArray.at(0))->
getInnerNodes();
376 EXPECT_EQ(2, innerEnds.size());
377 EXPECT_TRUE(nodeWasFound(innerEnds, intNetwork.
getNode(intArray.at(1))));
378 EXPECT_TRUE(nodeWasFound(innerEnds, intNetwork.
getNode(intArray.at(2))));
379 EXPECT_TRUE(nodeWasFound(innerEnds, innerEnds.at(1)));
382 B2INFO(
"case: when outer both were there and already linked: ");
383 EXPECT_FALSE(intNetwork.
linkNodes(intArray.at(0), intArray.at(2)));
385 EXPECT_EQ(sizeB4, intNetwork.
size());
388 std::vector<DirectedNode<int, VoidMetaInfo>*> moreInnerEnds = intNetwork.
getNode(intArray.at(0))->
getInnerNodes();
389 EXPECT_EQ(innerEnds.size(), moreInnerEnds.size());
390 EXPECT_TRUE(nodeWasFound(innerEnds, moreInnerEnds.at(0)));
391 EXPECT_TRUE(nodeWasFound(innerEnds, moreInnerEnds.at(1)));
395 B2INFO(
"testing members for filling, when (at least) one entry was already there:"); {
396 B2INFO(
"case: addInnerToLastOuterNode: both were there, but not linked yet: ");
397 unsigned int networkSizeB4 = intNetwork.
size();
398 unsigned int nInnerEndsB4 = intNetwork.
getInnerEnds().size();
400 EXPECT_EQ(networkSizeB4, intNetwork.
size());
401 EXPECT_EQ(nInnerEndsB4, intNetwork.
getInnerEnds().size());
402 std::vector<DirectedNode<int, VoidMetaInfo>*> innerEnds = intNetwork.
getNode(intArray.at(0))->
getInnerNodes();
403 EXPECT_EQ(3, innerEnds.size());
405 EXPECT_TRUE(nodeWasFound(innerEnds, intNetwork.
getNode(intArray.at(1))));
406 EXPECT_TRUE(nodeWasFound(innerEnds, intNetwork.
getNode(intArray.at(2))));
407 EXPECT_TRUE(nodeWasFound(innerEnds, intNetwork.
getNode(intArray.at(3))));
412 B2INFO(
"case: addInnerToLastOuterNode: both were there, but already linked (same results as before, but with an error for unintended behavior):");
413 unsigned int networkSizeB4 = intNetwork.
size();
414 unsigned int nInnerEndsB4 = intNetwork.
getInnerEnds().size();
416 EXPECT_EQ(networkSizeB4, intNetwork.
size());
417 EXPECT_EQ(nInnerEndsB4, intNetwork.
getInnerEnds().size());
418 std::vector<DirectedNode<int, VoidMetaInfo>*> innerEnds = intNetwork.
getNode(intArray.at(0))->
getInnerNodes();
419 EXPECT_EQ(3, innerEnds.size());
421 EXPECT_TRUE(nodeWasFound(innerEnds, intNetwork.
getNode(intArray.at(1))));
422 EXPECT_TRUE(nodeWasFound(innerEnds, intNetwork.
getNode(intArray.at(2))));
423 EXPECT_TRUE(nodeWasFound(innerEnds, intNetwork.
getNode(intArray.at(3))));