ATLAS Offline Software
Loading...
Searching...
No Matches
CompetingRIOsOnTrack.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
6// CompetingRIOsOnTrack.cxx, (c) ATLAS Detector software
8
10// CLHEP
11//#include "CLHEP/Matrix/SymMatrix.h"
14
15#include <boost/io/ios_state.hpp>
16#include <iostream>
17
18// default constructor
24// constructor with parameters
25Trk::CompetingRIOsOnTrack::CompetingRIOsOnTrack(std::vector<AssignmentProb>&& assgnProb)
27 , m_assignProb(std::move(assgnProb))
28{
29}
30
31// return the effective LocalParameters according to the weights (assignment probabilities)
32//@f$ \~m = (\sum_i p_i G_i)^{-1} \sum_i p_i G_i m_i @f$
33void
35{
36
38 // std::cout << "CompROT - weight matrices: " << std::endl;
39 // std::cout << "CompROT - [1] " << rioOnTrack(0).localCovariance() << std::endl;
40 Amg::MatrixX meanWeightMatrix =
41 assignmentProbability(0) * rioOnTrack(0).localCovariance().inverse();
42 for (unsigned int i = 1; i < numberOfContainedROTs(); i++) {
43 meanWeightMatrix += assignmentProbability(i) * rioOnTrack(i).localCovariance().inverse();
44 // std::cout << "CompROT - ["<< i << "] " << rioOnTrack(i).localCovariance() <<
45 // std::endl;
46 }
47 // limit weight values against values too close to 0, otherwise inversion will fail!
48 if (meanWeightMatrix.trace() <= 1.0e-15) {
49 meanWeightMatrix = Amg::MatrixX(rioOnTrack(0).localCovariance().rows(),
50 rioOnTrack(0).localCovariance().cols());
51 meanWeightMatrix.setZero();
52 for (int i = 0; i < meanWeightMatrix.cols(); ++i) {
53 meanWeightMatrix(i, i) = 1.0e-10;
54 }
55 }
56 // std::cout << "CompROT - mean weight: " << meanWeightMatrix << std::endl;
57 m_localCovariance = meanWeightMatrix.inverse();
58 // std::cout << "CompROT - mean covariance: " << localCovariance() << std::endl;
59
60 if (numberOfContainedROTs() == 1) {
61 m_localParams = rioOnTrack(0).localParameters();
62 } else {
63 Amg::MatrixX weight = rioOnTrack(0).localCovariance().inverse();
64 Amg::VectorX meanParams =
65 assignmentProbability(0) * weight * rioOnTrack(0).localParameters();
66 for (unsigned int i = 1; i < numberOfContainedROTs(); i++) {
67 weight = rioOnTrack(i).localCovariance().inverse();
68 meanParams =
69 meanParams + assignmentProbability(i) * weight * rioOnTrack(i).localParameters();
70 }
71 // std::cout << "CompROT - sum params: " << meanParams << std::endl;
72 meanParams = localCovariance() * meanParams;
73 // std::cout << "CompROT - mean params: " << meanParams << std::endl;
74 int paramKey = rioOnTrack(0).localParameters().parameterKey();
75 if (paramKey == 1) {
76 Trk::DefinedParameter Par1(meanParams[Trk::loc1], Trk::loc1);
78 } else if (paramKey == 3) {
79 Trk::DefinedParameter Par1(meanParams[Trk::loc1], Trk::loc1);
80 Trk::DefinedParameter Par2(meanParams[Trk::loc2], Trk::loc2);
82 } else {
83 std::cout << "Trk::CompetingRIOsOnTrack: can not handle parameter key " << paramKey
84 << std::endl;
85 }
86 }
87 } else {
88 // --------------------------------------------------
89 // Warning: effective localParams cannot be calculated when ROTs don't lie on the
90 // associated surface without detector specific knowledge.
91 // --------------------------------------------------
92 // return 0;
93 std::cout
94 << "Trk::CompetingRIOsOnTrack: can not handle ROTs in different surfaces without "
95 "detector specific knowledge "
96 << std::endl;
97 }
98}
99
100unsigned int
102{
103 unsigned int index = 0;
104 double maxAssgnProb = 0;
105 for (unsigned int i = 0; i < numberOfContainedROTs(); i++) {
106 if (m_assignProb[i] >= maxAssgnProb) {
107 index = i;
108 maxAssgnProb = m_assignProb[i];
109 }
110 }
111 return index;
112}
113
114MsgStream&
116{
117
118 boost::io::ios_all_saver ias(out.stream());
119 out << " - effective pars locX : ";
120 if (m_localParams.contains(Trk::locX)) {
121 out << (m_localParams)[Trk::locX];
122 if (m_localParams.contains(Trk::locY)) {
123 out << " and " << (m_localParams)[Trk::locY];
124 }
125 } else {
126 out << "ill-defined! They are " << m_localParams;
127 }
129 if (m_localParams.contains(Trk::locY)) {
131 out << std::endl // << std::setiosflags(ios::right)<<std::setiosflags(ios::adjustfield)
132 << std::setiosflags(std::ios::fixed) << std::resetiosflags(std::ios::scientific)
133 << std::setprecision(6);
134 }
135 unsigned int indexOfMaxProb = indexOfMaxAssignProb();
136 out << " - Contains: |ROT# identifier locX dLocX locY dlocY "
137 "ass.Prob |";
138 for (unsigned int i = 0; i < this->numberOfContainedROTs(); ++i) {
139 out << std::endl
140 << " | " << i << " " << this->rioOnTrack(i).identify() << " ";
142 out << std::setw(10) << this->rioOnTrack(i).localParameters()[Trk::locX] << " "
143 << 1 / this->rioOnTrack(i).localCovariance()(Trk::locX, Trk::locX);
144 } else {
145 out << " ";
146 }
148 out << " " << std::setw(10) << this->rioOnTrack(i).localParameters()[Trk::locY] << " "
149 << 1 / this->rioOnTrack(i).localCovariance()(Trk::locY, Trk::locY) << " ";
150 } else {
151 out << " ";
152 }
153 out << " " << m_assignProb.at(i) << (indexOfMaxProb == i ? " **|" : " |");
154 }
155 ias.restore();
156 return out;
157}
158
159std::ostream&
160Trk::CompetingRIOsOnTrack::dump(std::ostream& out) const
161{
162 boost::io::ios_all_saver ias(out);
163 out << " - effective pars locX : ";
164 if (m_localParams.contains(Trk::locX)) {
165 out << (m_localParams)[Trk::locX];
166 if (m_localParams.contains(Trk::locY)) {
167 out << " and " << (m_localParams)[Trk::locY];
168 }
169 } else {
170 out << "ill-defined! They are " << m_localParams;
171 }
173 if (m_localParams.contains(Trk::locY)) {
175 out << std::endl // << std::setiosflags(ios::right)<<std::setiosflags(ios::adjustfield)
176 << std::setiosflags(std::ios::fixed) << std::resetiosflags(std::ios::scientific)
177 << std::setprecision(6);
178 }
179
180 unsigned int indexOfMaxProb = indexOfMaxAssignProb();
181 out << " - Contains: |ROT# identifier locX dLocX locY dlocY "
182 "ass.Prob |";
183 for (unsigned int i = 0; i < this->numberOfContainedROTs(); ++i) {
184 out << std::endl
185 << " | " << i << " " << this->rioOnTrack(i).identify() << " ";
187 out << std::setw(10) << this->rioOnTrack(i).localParameters()[Trk::locX] << " "
188 << 1 / this->rioOnTrack(i).localCovariance()(Trk::locX, Trk::locX);
189 } else {
190 out << " ";
191 }
193 out << " " << std::setw(10) << this->rioOnTrack(i).localParameters()[Trk::locY] << " "
194 << 1 / this->rioOnTrack(i).localCovariance()(Trk::locY, Trk::locY) << " ";
195 } else {
196 out << " ";
197 }
198 out << " " << m_assignProb.at(i) << (indexOfMaxProb == i ? " **|" : " |");
199 }
200 ias.restore();
201 return out;
202}
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:114
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.