593 {
594
595 std::vector<Identifier> misAlignedTSOS;
596 std::vector<int> misAlignmentNumbers;
597 int misAlignmentNumber = 0;
598 int tsos = 0;
599
601 i != trackStateOnSurfaces.end(); ++i, ++tsos) {
602 const TrackStateOnSurface&
r = (**i);
603 if (!
r.alignmentEffectsOnTrack() || !
r.trackParameters()) {
604 continue;
605 }
606 const AlignmentEffectsOnTrack& AEOT = *
r.alignmentEffectsOnTrack();
607 ++misAlignmentNumber;
608 for (
const Identifier&
a : AEOT.vectorOfAffectedTSOS()) {
609 misAlignedTSOS.push_back(
a);
610 misAlignmentNumbers.push_back(misAlignmentNumber);
611 }
614 " tsos " << tsos << " misAlignedTSOS.size() " << misAlignedTSOS.size()
615 << " misAlignmentNumber " << misAlignmentNumber
616 << " offset " << AEOT.deltaTranslation() << " +- "
617 << AEOT.sigmaDeltaTranslation() << " rotation "
618 << AEOT.deltaAngle() << " +- " << AEOT.sigmaDeltaAngle());
619 }
620 }
621
622
623 bool haveMaterial = false;
624 bool haveMeasurement = false;
625 int hit = measurements.size();
627 double previousDistanceR = previousDistance;
628 double previousDistanceZ = previousDistance;
629 bool reorder = false;
630 const bool skipVertexMeasurement = !measurements.empty();
635 bool measurementsFlipped = false;
638 tsos = 0;
640 i != trackStateOnSurfaces.end(); ++i, ++hit, ++tsos) {
641 const TrackStateOnSurface&
s = (**i);
642 std::unique_ptr<FitMeasurement> measurement1;
643 std::unique_ptr<FitMeasurement> measurement2;
644 const Surface* surface = nullptr;
645 if (
s.materialEffectsOnTrack() &&
s.trackParameters()) {
650 surface = &
s.trackParameters()->associatedSurface();
651
652
653 bool keepScatterer = true;
654 if (
s.materialEffectsOnTrack()->thicknessInX0() < 0.0001) {
655 keepScatterer = false;
656 if (calo) {
657 const MaterialEffectsOnTrack* meot =
658 dynamic_cast<const MaterialEffectsOnTrack*>(
659 s.materialEffectsOnTrack());
660 if (meot) {
661 const EnergyLoss* energyLoss = meot->energyLoss();
662 if (energyLoss &&
663 std::abs(energyLoss->deltaE()) > 0.1 * Gaudi::Units::MeV) {
664 keepScatterer = true;
665 }
666 }
667 }
668 }
669 if (keepScatterer) {
670 measurement1 = std::make_unique<FitMeasurement>(
671 s.materialEffectsOnTrack(),
673 calo);
674 if (!calo && !haveMaterial &&
675 (haveMeasurement ||
s.measurementOnTrack())) {
676 haveMaterial = true;
677 }
678 } else {
680 continue;
681 }
682 }
else if (
s.alignmentEffectsOnTrack() &&
s.trackParameters()) {
683 const Amg::Vector3D direction =
s.trackParameters()->momentum().unit();
685 measurement1 = std::make_unique<FitMeasurement>(
686 s.alignmentEffectsOnTrack(), direction, position);
687 }
688 const Trk::MeasurementBase* measurementBase =
s.measurementOnTrack();
689 if (measurementBase) {
691 continue;
692 }
693
694 if (skipVertexMeasurement &&
695 dynamic_cast<const PerigeeSurface*
>(&
s.surface())) {
696 measurement1.reset();
697 continue;
698 }
699 haveMeasurement = true;
700 surface = &
s.measurementOnTrack()->associatedSurface();
701 measurement2 =
702 std::make_unique<FitMeasurement>(hit, nullptr, measurementBase);
704 measurement2->setOutlier();
705 }
706
707
708
709
710
711
712
713
714
715
716
717
718
719 if (misAlignmentNumber) {
720 Identifier id = Identifier();
721 if (measurementBase) {
722 const Trk::RIO_OnTrack* rot =
723 dynamic_cast<const Trk::RIO_OnTrack*>(measurementBase);
724 if (rot) {
726 } else {
727 const Muon::CompetingMuonClustersOnTrack* crot =
728 dynamic_cast<const Muon::CompetingMuonClustersOnTrack*>(
729 measurementBase);
733 }
734 }
735 }
736 for (
unsigned int im = 0;
im < misAlignedTSOS.size(); ++
im) {
737 if (misAlignedTSOS[im] != id) {
738 continue;
739 }
740 measurement2->alignmentParameter(misAlignmentNumbers[im]);
741 }
743 for (
unsigned int im = 0;
im < misAlignedTSOS.size(); ++
im) {
744 if (misAlignedTSOS[im] != id) {
745 continue;
746 }
747 if (measurement2->isDrift()) {
748 ATH_MSG_DEBUG(
" tsos " << tsos <<
" Drift Measurement im " << im
749 << " with misAlignmentNumber "
750 << misAlignmentNumbers[im]);
751 } else {
752 ATH_MSG_DEBUG(
" tsos " << tsos <<
" Cluster Measurement im " << im
753 << " with misAlignmentNumber "
754 << misAlignmentNumbers[im]);
755 }
756 }
757 }
758 }
759 }
else if (!measurement1 &&
s.trackParameters()) {
761 measurement2 = std::make_unique<FitMeasurement>(s);
763 if (i == trackStateOnSurfaces.begin()) {
764 continue;
765 }
767 dynamic_cast<const Perigee*
>(
s.trackParameters());
768 if (!perigee) {
769 continue;
770 }
771 measurement2 = std::make_unique<FitMeasurement>(*perigee);
773 continue;
774 } else {
775
777 continue;
778 }
779 }
else if (
s.materialEffectsOnTrack()) {
780 surface = &
s.materialEffectsOnTrack()->associatedSurface();
781 }
else if (
s.alignmentEffectsOnTrack()) {
782 surface = &
s.alignmentEffectsOnTrack()->associatedSurface();
783 } else {
784
785
787 continue;
788 }
789
790
791 if (
s.trackParameters() && (measurement1 || measurement2)) {
793 if (startDirection.dot(direction) < 0.) {
794 measurementsFlipped = true;
795 direction = -direction;
796 if (measurement1) {
797 measurement1->flipDriftDirection();
798 }
799 if (measurement2) {
800 measurement2->flipDriftDirection();
801 }
802 }
805 s.trackParameters()->position(), direction, 0.);
806 } else if (surface) {
807 std::optional<TrackSurfaceIntersection> newIntersection =
810
811 if (!newIntersection) {
813 measurement2.reset();
814 continue;
815 }
816
818 if (
s.materialEffectsOnTrack()) {
822 measurement1 = std::make_unique<FitMeasurement>(
823 s.materialEffectsOnTrack(),
826 if (!calo && !haveMaterial && haveMeasurement) {
827 haveMaterial = true;
828 }
829 } else if (!measurement2) {
830
832
833 continue;
834 }
835 }
836
837
838 if (!reorder) {
840 startDirection.dot(
intersection.position() - startPosition);
842 if (
s.measurementOnTrack()) {
843 positionMst =
s.measurementOnTrack()->globalPosition();
844 }
845 if (
s.materialEffectsOnTrack()) {
846 positionMst =
s.materialEffectsOnTrack()->associatedSurface().center();
847 }
848 const double distanceR = std::sqrt((positionMst.x() - startPosition.x()) *
849 (positionMst.x() - startPosition.x()) +
850 (positionMst.y() - startPosition.y()) *
851 (positionMst.y() - startPosition.y()));
852 double distanceZ = (positionMst.z() - startPosition.z());
853 if (startDirection.z() < 0) {
854 distanceZ = -distanceZ;
855 }
856 if (distance < previousDistance && distanceR < previousDistanceR &&
857 distanceZ < previousDistanceZ) {
858 reorder = true;
860 << distance - previousDistance << " R distance "
861 << distanceR - previousDistanceR << " Z distance "
862 << distanceZ - previousDistanceZ);
863 }
867 }
868
869
870 if (measurement1) {
871 if (measurement2) {
872 TrackSurfaceIntersection intersectionCopy =
intersection;
873 measurement1->intersection(type, intersectionCopy);
874 measurements.push_back(measurement1.release());
875 } else {
877 measurement1->qOverP(
qOverP);
878 measurements.push_back(measurement1.release());
879 }
880 }
881 if (measurement2) {
883 measurement2->qOverP(
qOverP);
884 measurements.push_back(measurement2.release());
885 }
886 }
887
888
889 if (reorder) {
891 startPosition);
892 }
893 if (measurementsFlipped) {
895 }
896
897
898 return haveMaterial;
899}
#define ATH_MSG_VERBOSE(x)
DataModel_detail::const_iterator< DataVector > const_iterator
const std::vector< const MuonClusterOnTrack * > & containedROTs() const
returns the vector of SCT_ClusterOnTrack objects .
const Amg::MatrixX & localCovariance() const
Interface method to get the localError.
Identifier identify() const
return the identifier -extends MeasurementBase
@ Perigee
This represents a perigee, and so will contain a Perigee object only.
@ Parameter
This TSOS contains a Trk::ParameterBase.
@ Outlier
This TSoS contains an outlier, that is, it contains a MeasurementBase/RIO_OnTrack which was not used ...
@ Hole
A hole on the track - this is defined in the following way.
std::unique_ptr< Trk::Volume > m_calorimeterVolume
ToolHandle< IMaterialAllocator > m_materialAllocator
std::unique_ptr< Trk::Volume > m_indetVolume
Gaudi::Property< double > m_orderingTolerance
ToolHandle< IPropagator > m_stepPropagator
Gaudi::Property< bool > m_extendedDebug
std::vector< std::string > intersection(std::vector< std::string > &v1, std::vector< std::string > &v2)
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
bool hasPositiveDiagElems(const AmgSymMatrix(N) &mat)
Returns true if all diagonal elements of the covariance matrix are finite aka sane in the above defin...
Eigen::Matrix< double, 3, 1 > Vector3D
constexpr double mass[PARTICLEHYPOTHESES]
the array of masses
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee