ATLAS Offline Software
Loading...
Searching...
No Matches
CompetingRIOsOnTrack.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6// CompetingRIOsOnTrack.cxx, (c) ATLAS Detector software
8
10
13#include "GaudiKernel/MsgStream.h"
14#include <format>
15#include <iostream>
16
17// default constructor
23// constructor with parameters
24Trk::CompetingRIOsOnTrack::CompetingRIOsOnTrack(std::vector<AssignmentProb>&& assgnProb)
26 , m_assignProb(std::move(assgnProb))
27{
28}
29
30// return the effective LocalParameters according to the weights (assignment probabilities)
31//@f$ \~m = (\sum_i p_i G_i)^{-1} \sum_i p_i G_i m_i @f$
32void
34{
35
37 // std::cout << "CompROT - weight matrices: " << std::endl;
38 // std::cout << "CompROT - [1] " << rioOnTrack(0).localCovariance() << std::endl;
39 Amg::MatrixX meanWeightMatrix =
40 assignmentProbability(0) * rioOnTrack(0).localCovariance().inverse();
41 for (unsigned int i = 1; i < numberOfContainedROTs(); i++) {
42 meanWeightMatrix += assignmentProbability(i) * rioOnTrack(i).localCovariance().inverse();
43 // std::cout << "CompROT - ["<< i << "] " << rioOnTrack(i).localCovariance() <<
44 // std::endl;
45 }
46 // limit weight values against values too close to 0, otherwise inversion will fail!
47 if (meanWeightMatrix.trace() <= 1.0e-15) {
48 meanWeightMatrix = Amg::MatrixX(rioOnTrack(0).localCovariance().rows(),
49 rioOnTrack(0).localCovariance().cols());
50 meanWeightMatrix.setZero();
51 for (int i = 0; i < meanWeightMatrix.cols(); ++i) {
52 meanWeightMatrix(i, i) = 1.0e-10;
53 }
54 }
55 // std::cout << "CompROT - mean weight: " << meanWeightMatrix << std::endl;
56 m_localCovariance = meanWeightMatrix.inverse();
57 // std::cout << "CompROT - mean covariance: " << localCovariance() << std::endl;
58
59 if (numberOfContainedROTs() == 1) {
60 m_localParams = rioOnTrack(0).localParameters();
61 } else {
62 Amg::MatrixX weight = rioOnTrack(0).localCovariance().inverse();
63 Amg::VectorX meanParams =
64 assignmentProbability(0) * weight * rioOnTrack(0).localParameters();
65 for (unsigned int i = 1; i < numberOfContainedROTs(); i++) {
66 weight = rioOnTrack(i).localCovariance().inverse();
67 meanParams =
68 meanParams + assignmentProbability(i) * weight * rioOnTrack(i).localParameters();
69 }
70 // std::cout << "CompROT - sum params: " << meanParams << std::endl;
71 meanParams = localCovariance() * meanParams;
72 // std::cout << "CompROT - mean params: " << meanParams << std::endl;
73 int paramKey = rioOnTrack(0).localParameters().parameterKey();
74 if (paramKey == 1) {
75 Trk::DefinedParameter Par1(meanParams[Trk::loc1], Trk::loc1);
77 } else if (paramKey == 3) {
78 Trk::DefinedParameter Par1(meanParams[Trk::loc1], Trk::loc1);
79 Trk::DefinedParameter Par2(meanParams[Trk::loc2], Trk::loc2);
81 } else {
82 std::cout << "Trk::CompetingRIOsOnTrack: can not handle parameter key " << paramKey
83 << std::endl;
84 }
85 }
86 } else {
87 // --------------------------------------------------
88 // Warning: effective localParams cannot be calculated when ROTs don't lie on the
89 // associated surface without detector specific knowledge.
90 // --------------------------------------------------
91 // return 0;
92 std::cout
93 << "Trk::CompetingRIOsOnTrack: can not handle ROTs in different surfaces without "
94 "detector specific knowledge "
95 << std::endl;
96 }
97}
98
99unsigned int
101{
102 unsigned int index = 0;
103 double maxAssgnProb = 0;
104 for (unsigned int i = 0; i < numberOfContainedROTs(); i++) {
105 if (m_assignProb[i] >= maxAssgnProb) {
106 index = i;
107 maxAssgnProb = m_assignProb[i];
108 }
109 }
110 return index;
111}
112
113MsgStream&
115{
116 out << " - effective pars locX : ";
117 if (m_localParams.contains(Trk::locX)) {
118 out << (m_localParams)[Trk::locX];
119 if (m_localParams.contains(Trk::locY)) {
120 out << " and " << (m_localParams)[Trk::locY];
121 }
122 } else {
123 out << "ill-defined! They are " << m_localParams;
124 }
126 if (m_localParams.contains(Trk::locY)) {
128 out << std::endl;
129 }
130 unsigned int indexOfMaxProb = indexOfMaxAssignProb();
131 out << " - Contains: |ROT# identifier locX dLocX locY dlocY "
132 "ass.Prob |";
133 for (unsigned int i = 0; i < this->numberOfContainedROTs(); ++i) {
134 out << std::endl
135 << " | " << i << " " << this->rioOnTrack(i).identify() << " ";
137 out << std::format("{:>10.6f} {}",
140 } else {
141 out << " ";
142 }
144 out << std::format(" {:>10.6f} {} ",
147 } else {
148 out << " ";
149 }
150 out << " " << m_assignProb.at(i) << (indexOfMaxProb == i ? " **|" : " |");
151 }
152 return out;
153}
154
155std::ostream&
156Trk::CompetingRIOsOnTrack::dump(std::ostream& out) const
157{
158 out << " - effective pars locX : ";
159 if (m_localParams.contains(Trk::locX)) {
160 out << (m_localParams)[Trk::locX];
161 if (m_localParams.contains(Trk::locY)) {
162 out << " and " << (m_localParams)[Trk::locY];
163 }
164 } else {
165 out << "ill-defined! They are " << m_localParams;
166 }
168 if (m_localParams.contains(Trk::locY)) {
170 out << std::endl;
171 }
172
173 unsigned int indexOfMaxProb = indexOfMaxAssignProb();
174 out << " - Contains: |ROT# identifier locX dLocX locY dlocY "
175 "ass.Prob |";
176 for (unsigned int i = 0; i < this->numberOfContainedROTs(); ++i) {
177 out << std::endl
178 << " | " << i << " " << this->rioOnTrack(i).identify() << " ";
180 out << std::format("{:>10.6f} {}",
183 } else {
184 out << " ";
185 }
187 out << std::format(" {:>10.6f} {} ",
190 } else {
191 out << " ";
192 }
193 out << " " << m_assignProb.at(i) << (indexOfMaxProb == i ? " **|" : " |");
194 }
195 return out;
196}
virtual bool ROTsHaveCommonSurface(const bool withNonVanishingAssignProb=true) const =0
query if all the contained ROTs have a common associated surface.
virtual void setLocalParametersAndErrorMatrix()
recalculate the LocalParameters and ErrorMatrix
std::vector< AssignmentProb > m_assignProb
assignment probabilities of the ROTs
AssignmentProb assignmentProbability(unsigned int indx) const
returns the AssignmentProbability depending on the integer.
virtual unsigned int numberOfContainedROTs() const =0
Number of RIO_OnTracks to be contained by this CompetingRIOsOnTrack.
virtual MsgStream & dump(MsgStream &out) const override
returns the some information about the base class members (avoid code duplication)
unsigned int indexOfMaxAssignProb() const
Index of the ROT with the highest assignment probability.
virtual const RIO_OnTrack & rioOnTrack(unsigned int) const =0
returns the RIO_OnTrack (also known as ROT) objects depending on the integer.
CompetingRIOsOnTrack()
Default Constructor for POOL.
const LocalParameters & localParameters() const
Interface method to get the LocalParameters.
MeasurementBase()=default
Default constructor - needed for POOL/SEAL.
const Amg::MatrixX & localCovariance() const
Interface method to get the localError.
LocalParameters m_localParams
Amg::MatrixX m_localCovariance
bool contains(const std::string &s, const std::string &regx)
does a string contain the substring
Definition hcg.cxx:116
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, Eigen::Dynamic, 1 > VectorX
Dynamic Vector - dynamic allocation.
Ensure that the ATLAS eigen extensions are properly loaded.
@ locY
local cartesian
Definition ParamDefs.h:38
@ locX
Definition ParamDefs.h:37
@ loc2
generic first and second local coordinate
Definition ParamDefs.h:35
@ loc1
Definition ParamDefs.h:34
std::pair< double, ParamDefs > DefinedParameter
Typedef to of a std::pair<double, ParamDefs> to identify a passed-through double as a specific type o...
Definition index.py:1
STL namespace.