457 {
458 std::vector<Amg::Vector2D> vectorOfPositions;
459 int numberOfSubclusters = 1;
460 vectorOfPositions.push_back(pixelPrepCluster->
localPosition());
461
464 InDet::PixelGangedClusterAmbiguities::const_iterator mapBegin = splitClusterMap->begin();
465 InDet::PixelGangedClusterAmbiguities::const_iterator mapEnd = splitClusterMap->end();
466 for (InDet::PixelGangedClusterAmbiguities::const_iterator mapIter = mapBegin; mapIter != mapEnd; ++mapIter) {
467 const InDet::SiCluster *
first = (*mapIter).first;
468 const InDet::SiCluster *
second = (*mapIter).second;
469 if (first == pixelPrepCluster && second != pixelPrepCluster) {
470 ATH_MSG_DEBUG(
"Found additional split cluster in ambiguity map (+=1).");
471 numberOfSubclusters += 1;
472 const InDet::SiCluster *otherOne =
second;
473 const InDet::PixelCluster *pixelAddCluster = nullptr;
475 pixelAddCluster = static_cast<const InDet::PixelCluster *>(otherOne);
476 }
477 if (pixelAddCluster == nullptr) {
478 ATH_MSG_WARNING(
"Pixel ambiguity map has empty pixel cluster. Please DEBUG!");
479 continue;
480 }
481 vectorOfPositions.push_back(pixelAddCluster->
localPosition());
482
485 }
486 }
487 }
488
489
490
494 "Parameters are not at a plane ! Aborting cluster correction... ");
495 return false;
496 }
497
498 std::vector<Amg::Vector2D> allLocalPositions;
499 std::vector<Amg::MatrixX> allErrorMatrix;
500 allLocalPositions =
503 trackPar,
504 allErrorMatrix,
505 numberOfSubclusters);
506
507 if (allLocalPositions.empty()) {
508 ATH_MSG_DEBUG(
" Cluster cannot be treated by NN. Giving back to default clusterization " );
509
510 return false;
511 }
512
513 if (allLocalPositions.size() != size_t(numberOfSubclusters)) {
514 ATH_MSG_WARNING(
"Returned position vector size " << allLocalPositions.size() <<
515 " not according to expected number of subclusters: " << numberOfSubclusters << ". Abort cluster correction..." );
516 return false;
517 }
518
519
520
521
522
523 if (numberOfSubclusters == 1) {
524 finalposition = allLocalPositions[0];
525 finalerrormatrix = allErrorMatrix[0];
526 }
527
528 else if (numberOfSubclusters == 2) {
529 double distancesq1 =
530 square(vectorOfPositions[0][0] - allLocalPositions[0][0]) / allErrorMatrix[0](0, 0) +
531 square(vectorOfPositions[1][0] - allLocalPositions[1][0]) / allErrorMatrix[1](0, 0) +
532 square(vectorOfPositions[0][1] - allLocalPositions[0][1]) / allErrorMatrix[0](1, 1) +
533 square(vectorOfPositions[1][1] - allLocalPositions[1][1]) / allErrorMatrix[1](1, 1);
534
535 double distancesq2 =
536 square(vectorOfPositions[1][0] - allLocalPositions[0][0]) / allErrorMatrix[0](0, 0) +
537 square(vectorOfPositions[0][0] - allLocalPositions[1][0]) / allErrorMatrix[1](0, 0) +
538 square(vectorOfPositions[1][1] - allLocalPositions[0][1]) / allErrorMatrix[0](1, 1) +
539 square(vectorOfPositions[0][1] - allLocalPositions[1][1]) / allErrorMatrix[1](1, 1);
540
542 " Old pix (1) x: " << vectorOfPositions[0][0] << " y: " << vectorOfPositions[0][1] << "\n"
543 << " Old pix (2) x: " << vectorOfPositions[1][0] << " y: " << vectorOfPositions[1][1] << "\n"
544 << " Pix (1) x: " << allLocalPositions[0][0] << " +/- " << std::sqrt(allErrorMatrix[0](0, 0))
545 << " y: " << allLocalPositions[0][1] << " +/- " << std::sqrt(allErrorMatrix[0](1, 1)) <<"\n"
546 << " Pix (2) x: " << allLocalPositions[1][0] << " +/- " << std::sqrt(allErrorMatrix[1](0, 0))
547 << " y: " << allLocalPositions[1][1] << " +/- " << std::sqrt(allErrorMatrix[1](1, 1)) << "\n"
548 << " Old (1) new (1) dist: " << std::sqrt(distancesq1) << " Old (1) new (2) " << std::sqrt(distancesq2) );
549
550
551 if (distancesq1 < distancesq2) {
552 finalposition = allLocalPositions[0];
553 finalerrormatrix = allErrorMatrix[0];
554 }else {
555 finalposition = allLocalPositions[1];
556 finalerrormatrix = allErrorMatrix[1];
557 }
558 }
559
560
561 else if (numberOfSubclusters == 3) {
562 double distances[6];
563
564 distances[0] =
distance(vectorOfPositions, allLocalPositions, allErrorMatrix, 0, 1, 2);
565 distances[1] =
distance(vectorOfPositions, allLocalPositions, allErrorMatrix, 0, 2, 1);
566 distances[2] =
distance(vectorOfPositions, allLocalPositions, allErrorMatrix, 1, 0, 2);
567 distances[3] =
distance(vectorOfPositions, allLocalPositions, allErrorMatrix, 1, 2, 0);
568 distances[4] =
distance(vectorOfPositions, allLocalPositions, allErrorMatrix, 2, 0, 1);
569 distances[5] =
distance(vectorOfPositions, allLocalPositions, allErrorMatrix, 2, 1, 0);
570
571 int smallestDistanceIndex = -10;
572 double minDistance = 1e10;
573
574 for (
int i = 0;
i < 6;
i++) {
575 ATH_MSG_VERBOSE(
" distance n.: " << i <<
" distance is: " << distances[i]);
576
577 if (distances[i] < minDistance) {
578 minDistance = distances[
i];
579 smallestDistanceIndex =
i;
580 }
581 }
582
583 ATH_MSG_DEBUG(
" The minimum distance is : " << minDistance <<
" for index: " << smallestDistanceIndex);
584
585 if (smallestDistanceIndex == 0 || smallestDistanceIndex == 1) {
586 finalposition = allLocalPositions[0];
587 finalerrormatrix = allErrorMatrix[0];
588 }
589 if (smallestDistanceIndex == 2 || smallestDistanceIndex == 4) {
590 finalposition = allLocalPositions[1];
591 finalerrormatrix = allErrorMatrix[1];
592 }
593 if (smallestDistanceIndex == 3 || smallestDistanceIndex == 5) {
594 finalposition = allLocalPositions[2];
595 finalerrormatrix = allErrorMatrix[2];
596 }
597 }
598 return true;
599}
virtual constexpr SurfaceType surfaceType() const override=0
Returns the Surface Type enum for the surface used to define the derived class.
virtual constexpr ParametersType type() const override=0
Return the ParametersType enum.
virtual const Surface & associatedSurface() const override=0
Access to the Surface associated to the Parameters.
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space