ATLAS Offline Software
Loading...
Searching...
No Matches
SimpleConstraintPointMinimizer Class Reference

#include <SimpleConstraintPointMinimizer.h>

Collaboration diagram for SimpleConstraintPointMinimizer:

Public Member Functions

 SimpleConstraintPointMinimizer (double proximity)
 ~SimpleConstraintPointMinimizer ()=default
double findMinimum (const std::vector< SurveyConstraintPoint > &points, Amg::Vector3D &aRotat, Amg::Vector3D &translate)
double secondMinimum (const std::vector< SurveyConstraintPoint > &points, Amg::Vector3D &aRotat1, Amg::Vector3D &translate1, Amg::Vector3D &aRotat2, Amg::Vector3D &translate2)

Private Attributes

double m_proximity

Detailed Description

Definition at line 20 of file SimpleConstraintPointMinimizer.h.

Constructor & Destructor Documentation

◆ SimpleConstraintPointMinimizer()

SimpleConstraintPointMinimizer::SimpleConstraintPointMinimizer ( double proximity)

Definition at line 18 of file SimpleConstraintPointMinimizer.cxx.

◆ ~SimpleConstraintPointMinimizer()

SimpleConstraintPointMinimizer::~SimpleConstraintPointMinimizer ( )
default

Member Function Documentation

◆ findMinimum()

double SimpleConstraintPointMinimizer::findMinimum ( const std::vector< SurveyConstraintPoint > & points,
Amg::Vector3D & aRotat,
Amg::Vector3D & translate )

Definition at line 25 of file SimpleConstraintPointMinimizer.cxx.

27{
28 aRotat = Amg::Vector3D(0,0,0);
29 translate = Amg::Vector3D(0,0,0);
30 Amg::Vector3D aRotat2(0,0,0),translate2(0,0,0);
31 double delta1,delta2,delta3;
32 double retval = -1.0;
33 double retval_old = 100.0;
34 double retval_min = retval_old;
35 unsigned niterat(0);
36 do {
37 // cout << "SimpleConstraintPointMinimizer().findMinimum: niterat " << niterat+1 << ", entering secondMinimum" << endl;
38 retval = secondMinimum(points,aRotat,translate,aRotat2,translate2);
39 // diagnostics
40 delta1=translate2.mag();
41 delta2=aRotat2.mag();
42 delta3=retval_old-retval;
43 if(delta3<-0.001){
44 cout<<" findMinimum: bad goodness step, > 10 un "<<endl;
45 }
46 if(retval<retval_min){retval_min=retval;}
47// cout << "SimpleConstraintPointMinimizer().findMinimum: niterat " << niterat + 1
48// <<", trans, rot: "<<delta1<<","<<delta2
49// <<", retval_min: "<<retval_min
50// <<", retval_old: "<<retval_old
51// <<", retval: "<<retval
52// << endl;
53 retval_old = retval;
54 // accumulate
55 translate+=translate2;
56 aRotat+=aRotat2;
57 niterat++;
58 } while ( (niterat<10) & ((delta1>0.00001)|(delta2>0.00001)) );
59 // print diagnostics
60 if(niterat==10){
61 cout<<" findMinimum: 10 iterations, not converging "<<endl;
62 }
63 if( (retval>retval_min) & (retval>0.00001) & ((retval-retval_min)/retval>0.1)){
64 cout<<" findMinimum: bad goodness, not converging: "
65 <<retval<<" > "<<retval_min<<endl;
66 }
67 //
68 // cout<<" findMinimum: "<<niterat<<" iterations "<<retval<<endl;
69 // cout<<" trans, rot: "<<delta1<<" "<<delta2<<endl;
70 // cout<<" "<<endl;
71 //
72 return retval;
73}
double secondMinimum(const std::vector< SurveyConstraintPoint > &points, Amg::Vector3D &aRotat1, Amg::Vector3D &translate1, Amg::Vector3D &aRotat2, Amg::Vector3D &translate2)
Eigen::Matrix< double, 3, 1 > Vector3D

◆ secondMinimum()

double SimpleConstraintPointMinimizer::secondMinimum ( const std::vector< SurveyConstraintPoint > & points,
Amg::Vector3D & aRotat1,
Amg::Vector3D & translate1,
Amg::Vector3D & aRotat2,
Amg::Vector3D & translate2 )

Definition at line 77 of file SimpleConstraintPointMinimizer.cxx.

80{
81 Amg::Vector3D Vect;
82 Amg::Vector3D Rota;
83 translate2 = Amg::Vector3D(0,0,0);
84
85 Amg::Translation3D amgtranslation(translate1);
86 Amg::Transform3D Transform = amgtranslation * Amg::RotationMatrix3D::Identity();
87 Transform *= Amg::AngleAxis3D(aRotat1[2], Amg::Vector3D(0.,0.,1.));
88 Transform *= Amg::AngleAxis3D(aRotat1[1], Amg::Vector3D(0.,1.,0.));
89 Transform *= Amg::AngleAxis3D(aRotat1[0], Amg::Vector3D(1.,0.,0.));
90
91
92 // loop over the points, use the ones within the proximity
93 // find the center point (weight point) and translation
94 unsigned ipoint, ngood(0);
95 unsigned npoints = points.size();
96 Amg::Vector3D wPoint(0,0,0);
97 for(ipoint=0;ipoint<npoints;ipoint++){
98 if(points[ipoint].survey().mag() <= m_proximity){
99 const Amg::Vector3D& cur = points[ipoint].current();
100 Amg::Vector3D dummy = points[ipoint].survey();
102 Amg::Vector3D cPoint = Amg::Vector3D(cur.x(),cur.y(),cur.z());
103 Amg::Vector3D sPoint = Amg::Vector3D(sur.x(),sur.y(),sur.z());
104 wPoint += sPoint;
105 translate2 += cPoint-sPoint;
106 ngood++;
107
108 // cout
109// <<"SimpleConstraintPointMinimizer().secondMinimum: points[ipoint].survey().mag(): "<<points[ipoint].survey().mag()
110// <<", wPoint.mag(): "<<wPoint.mag()
111// <<", translate2.mag(): "<<translate2.mag()
112// <<", ngood: "<<ngood
113// << endl;
114
115 }
116 }
117 if(ngood>=1){
118 wPoint *= 1.0/ngood;
119 translate2 *= 1.0/ngood;
120 // accumulate momentum and tensor
121 Amg::MatrixX Tens(3,3);
122 Amg::Vector3D theLcm(0,0,0);
123 for(ipoint=0;ipoint<npoints;ipoint++){
124 if(points[ipoint].survey().mag() <= m_proximity){
125 const Amg::Vector3D& cur = points[ipoint].current();
126 Amg::Vector3D dummy = points[ipoint].survey();
128 Amg::Vector3D cPoint = Amg::Vector3D(cur.x(),cur.y(),cur.z());
129 Amg::Vector3D sPoint = Amg::Vector3D(sur.x(),sur.y(),sur.z());
130 Amg::Vector3D thePoint = sPoint-wPoint;
131 Amg::Vector3D theDelta = cPoint-sPoint-translate2;
132 theLcm += thePoint.cross(theDelta);
133 Vect[0] = thePoint.x();
134 Vect[1] = thePoint.y();
135 Vect[2] = thePoint.z();
136 AmgSymMatrix(3) temp; temp.setIdentity();
137 Tens += thePoint.mag2()*temp;//- Vect.transpose() * Vect;
138
139 // cout
140 // <<"SimpleConstraintPointMinimizer().secondMinimum: theDelta.mag(): "<<theDelta.mag()
141 // <<", theLcm.mag(): "<<theLcm.mag()
142 // << endl;
143
144 }
145 }
146 // find rotation angles and translation
147 Vect[0] = theLcm.x();
148 Vect[1] = theLcm.y();
149 Vect[2] = theLcm.z();
150 Rota= Tens.inverse() * Vect;
151 aRotat2 = Amg::Vector3D(Rota[0],Rota[1],Rota[2]);
152 translate2 -= aRotat2.cross(wPoint);
153 }else{
154 aRotat2.setZero();
155 translate2.setZero();
156 }
157 // now compute the 'goodness of fit' as average distance/point
158 double retval = -1.0;
159 double distsum(0.0);
160 Amg::Vector3D aRotat=aRotat1+aRotat2;
161 Amg::Vector3D translate=translate1+translate2;
162
163 Amg::Translation3D amgtranslate(translate);
164 Amg::Transform3D transform2 = amgtranslate * Amg::RotationMatrix3D::Identity();
165 transform2 *= Amg::AngleAxis3D(aRotat[2], Amg::Vector3D(0.,0.,1.));
166 transform2 *= Amg::AngleAxis3D(aRotat[1], Amg::Vector3D(0.,1.,0.));
167 transform2 *= Amg::AngleAxis3D(aRotat[0], Amg::Vector3D(1.,0.,0.));
168
169
170 for(ipoint=0;ipoint<npoints;ipoint++){
171 if(points[ipoint].survey().mag() <= m_proximity){
172 const Amg::Vector3D& cur = points[ipoint].current();
173 Amg::Vector3D dummy = points[ipoint].survey();
175 distsum += (cur - sur).mag();
176 }
177 }
178 if (ngood!=0){
179 retval = distsum/ngood;
180 } else {
181 retval = std::numeric_limits<double>::infinity();
182 }
183// cout
184// <<"SimpleConstraintPointMinimizer().secondMinimum: aRotat2.mag(): "<<aRotat2.mag()
185// <<", (aRotat2.cross(wPoint)).mag(): "<<(aRotat2.cross(wPoint)).mag()
186// <<", translate2.mag(): "<<translate2.mag()
187// <<", aRotat.mag(): "<<aRotat.mag()
188// <<", translate.mag(): "<<translate.mag()
189// <<", distsum: "<<distsum
190// <<", ngood: "<<ngood
191// <<", retval: "<<retval
192// << endl;
193 return retval;
194}
Scalar mag() const
mag method
Scalar mag2() const
mag2 method - forward to squaredNorm()
Transform(const Vector3d &translation)
Affine Transform constuctors construct an augmented Matrix R R R T R R R T R R R T 0 0 0 1 Where R is...
#define AmgSymMatrix(dim)
Eigen::Matrix< double, 3, 1 > Vector3D
#define y
#define x
#define z
Eigen::AngleAxisd AngleAxis3D
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Affine3d Transform3D
Eigen::Translation< double, 3 > Translation3D

Member Data Documentation

◆ m_proximity

double SimpleConstraintPointMinimizer::m_proximity
private

Definition at line 35 of file SimpleConstraintPointMinimizer.h.


The documentation for this class was generated from the following files: