ATLAS Offline Software
Public Member Functions | Private Attributes | List of all members
SimpleConstraintPointMinimizer Class Reference

#include <SimpleConstraintPointMinimizer.h>

Collaboration diagram for SimpleConstraintPointMinimizer:

Public Member Functions

 SimpleConstraintPointMinimizer (double proximity)
 
 ~SimpleConstraintPointMinimizer ()
 
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.

18  :
19  m_proximity(proximity)
20 {;}

◆ ~SimpleConstraintPointMinimizer()

SimpleConstraintPointMinimizer::~SimpleConstraintPointMinimizer ( )

Definition at line 22 of file SimpleConstraintPointMinimizer.cxx.

23 {;}

Member Function Documentation

◆ findMinimum()

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

Definition at line 27 of file SimpleConstraintPointMinimizer.cxx.

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

◆ secondMinimum()

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

Definition at line 79 of file SimpleConstraintPointMinimizer.cxx.

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

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:
Amg::MatrixX
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Definition: EventPrimitives.h:29
SimpleConstraintPointMinimizer::m_proximity
double m_proximity
Definition: SimpleConstraintPointMinimizer.h:35
beamspotman.cur
def cur
Definition: beamspotman.py:671
yodamerge_tmp.npoints
npoints
Definition: yodamerge_tmp.py:250
x
#define x
AmgSymMatrix
#define AmgSymMatrix(dim)
Definition: EventPrimitives.h:52
LArCellBinning_test.retval
def retval
Definition: LArCellBinning_test.py:112
Transform
Transform(const Vector3d &rotationMatrixCol0, const Vector3d &rotationMatrixCol1, const Vector3d &rotationMatrixCol2)
Definition: AmgTransformPlugin.h:12
SimpleConstraintPointMinimizer::secondMinimum
double secondMinimum(const std::vector< SurveyConstraintPoint > &points, Amg::Vector3D &aRotat1, Amg::Vector3D &translate1, Amg::Vector3D &aRotat2, Amg::Vector3D &translate2)
Definition: SimpleConstraintPointMinimizer.cxx:79
z
#define z
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
python.xAODType.dummy
dummy
Definition: xAODType.py:4
Amg
Definition of ATLAS Math & Geometry primitives (Amg)
Definition: AmgStringHelpers.h:19
generateBunchGroupSetFromOldKey.transform2
def transform2(oldbgs, bgsname, bgnames)
Definition: generateBunchGroupSetFromOldKey.py:37
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
y
#define y
Amg::Translation3D
Eigen::Translation< double, 3 > Translation3D
Definition: GeoPrimitives.h:44
Amg::AngleAxis3D
Eigen::AngleAxisd AngleAxis3D
Definition: GeoPrimitives.h:45
mag2
Scalar mag2() const
mag2 method - forward to squaredNorm()
Definition: AmgMatrixBasePlugin.h:30
mag
Scalar mag() const
mag method
Definition: AmgMatrixBasePlugin.h:25