Jpp master_rocky-44-g75b7c4f75
the software that should make you happy
Loading...
Searching...
No Matches
JDETECTOR::JRotation Struct Reference

Auxiliary class to get rotation matrix between two optical modules. More...

#include <JDetectorToolkit.hh>

Inheritance diagram for JDETECTOR::JRotation:
JGEOMETRY3D::JRotation3D JMATH::JMatrix3D JMATH::JMath< JFirst_t, JSecond_t > JMATH::JMath< JMatrix3D > JLANG::JEquals< JFirst_t, JSecond_t >

Public Member Functions

const JRotation3Doperator() (const JModule &first, const JModule &second)
 Get rotation matrix to go from first to second module.
 
const JRotation3DgetRotation () const
 Get rotation.
 
 operator JQuaternion3D () const
 Type conversion operator.
 
JRotation3Dtranspose ()
 Transpose.
 
JRotation3Dmul (const JRotation3D &A, const JRotation3D &B)
 Matrix multiplication.
 
JMatrix3Dmul (const double factor)
 Scale matrix.
 
JMatrix3Dmul (const JMatrix3D &A, const JMatrix3D &B)
 Matrix multiplication.
 
JMatrix3Dmul (const JSecond_t &object)
 Multiply with object.
 
JFirst_t & mul (const JSecond_t &object)
 Multiply with object.
 
void rotate (double &__x, double &__y, double &__z) const
 Rotate.
 
void rotate_back (double &__x, double &__y, double &__z) const
 Rotate back.
 
JMatrix3DsetIdentity ()
 Set to identity matrix.
 
void set (const JMatrix3D &A)
 Set matrix.
 
JMatrix3Dreset ()
 Set matrix to the null matrix.
 
JMatrix3Dnegate ()
 Negate matrix.
 
JMatrix3Dadd (const JMatrix3D &A)
 Matrix addition.
 
JMatrix3Dsub (const JMatrix3D &A)
 Matrix subtraction.
 
JMatrix3Ddiv (const double factor)
 Scale matrix.
 
bool equals (const JMatrix3D &A, const double eps=std::numeric_limits< double >::min()) const
 Equality.
 
bool isIdentity (const double eps=std::numeric_limits< double >::min()) const
 Test identity.
 
double getDeterminant () const
 Get determinant of matrix.
 
void transform (double &__x, double &__y, double &__z) const
 Transform.
 

Static Public Member Functions

static const JMatrix3DgetInstance ()
 Get reference to unique instance of this class object.
 
static const JMatrix3DgetIdentity ()
 Get reference to unique instance of this class object.
 

Public Attributes

double a00
 
double a01
 
double a02
 
double a10
 
double a11
 
double a12
 
double a20
 
double a21
 
double a22
 

Static Public Attributes

static const size_t NUMBER_OF_DIMENSIONS = 3
 Number of dimensions.
 

Private Member Functions

bool orthonormalise (const size_t index, const double precision=std::numeric_limits< double >::epsilon())
 Put normalised primary direction at specified index and orthoganilise following directions.
 

Private Attributes

std::vector< JVector3Din
 
std::vector< JVector3Dout
 

Detailed Description

Auxiliary class to get rotation matrix between two optical modules.

Definition at line 665 of file JDetectorToolkit.hh.

Member Function Documentation

◆ operator()()

const JRotation3D & JDETECTOR::JRotation::operator() ( const JModule & first,
const JModule & second )
inline

Get rotation matrix to go from first to second module.

Parameters
firstfirst module
secondsecond module
Returns
rotation matrix

Definition at line 679 of file JDetectorToolkit.hh.

680 {
681 this->setIdentity();
682
683 if (first.size() == second.size()) {
684
685 const size_t N = first.size();
686
687 if (N >= NUMBER_OF_DIMENSIONS) {
688
689 in .resize(N);
690 out.resize(N);
691
692 for (size_t i = 0; i != N; ++i) {
693 in [i] = first .getPMT(i).getDirection();
694 out[i] = second.getPMT(i).getDirection();
695 }
696
697 for (size_t i = 0; i != NUMBER_OF_DIMENSIONS; ++i) {
698 if (!orthonormalise(i)) {
699 THROW(JException, "Failure to orthonormalise direction " << i);
700 }
701 }
702
703 this->a00 = out[0].getX() * in[0].getX() + out[1].getX() * in[1].getX() + out[2].getX() * in[2].getX();
704 this->a01 = out[0].getX() * in[0].getY() + out[1].getX() * in[1].getY() + out[2].getX() * in[2].getY();
705 this->a02 = out[0].getX() * in[0].getZ() + out[1].getX() * in[1].getZ() + out[2].getX() * in[2].getZ();
706
707 this->a10 = out[0].getY() * in[0].getX() + out[1].getY() * in[1].getX() + out[2].getY() * in[2].getX();
708 this->a11 = out[0].getY() * in[0].getY() + out[1].getY() * in[1].getY() + out[2].getY() * in[2].getY();
709 this->a12 = out[0].getY() * in[0].getZ() + out[1].getY() * in[1].getZ() + out[2].getY() * in[2].getZ();
710
711 this->a20 = out[0].getZ() * in[0].getX() + out[1].getZ() * in[1].getX() + out[2].getZ() * in[2].getX();
712 this->a21 = out[0].getZ() * in[0].getY() + out[1].getZ() * in[1].getY() + out[2].getZ() * in[2].getY();
713 this->a22 = out[0].getZ() * in[0].getZ() + out[1].getZ() * in[1].getZ() + out[2].getZ() * in[2].getZ();
714
715 } else {
716
717 THROW(JException, "Module " << first.getID() << " size " << N << " < " << NUMBER_OF_DIMENSIONS);
718 }
719
720 } else {
721
722 THROW(JException, "Module " << first.getID() << " size " << first.size() << " != " << second.size());
723 }
724
725 return *this;
726 }
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
JMatrix3D & setIdentity()
Set to identity matrix.
std::vector< JVector3D > out
std::vector< JVector3D > in
bool orthonormalise(const size_t index, const double precision=std::numeric_limits< double >::epsilon())
Put normalised primary direction at specified index and orthoganilise following directions.
static const size_t NUMBER_OF_DIMENSIONS
Number of dimensions.

◆ orthonormalise()

bool JDETECTOR::JRotation::orthonormalise ( const size_t index,
const double precision = std::numeric_limits<double>::epsilon() )
inlineprivate

Put normalised primary direction at specified index and orthoganilise following directions.


This procedure follows Gram-Schmidt process.

Parameters
indexindex
precisionprecision
Returns
true if primary direction exists; else false

Definition at line 737 of file JDetectorToolkit.hh.

738 {
739 using namespace std;
740
741 size_t pos = index;
742
743 for (size_t i = index + 1; i != in.size(); ++i) {
744 if (in[i].getLengthSquared() > in[pos].getLengthSquared()) {
745 pos = i;
746 }
747 }
748
749 const double u = in[pos].getLength();
750
751 if (u > precision) {
752
753 in [pos] /= u;
754 out[pos] /= u;
755
756 if (pos != index) {
757 swap(in [pos], in [index]);
758 swap(out[pos], out[index]);
759 }
760
761 for (size_t i = index + 1; i != in.size(); ++i) {
762
763 const double dot = in[index].getDot(in[i]);
764
765 in [i] -= dot * in [index];
766 out[i] -= dot * out[index];
767 }
768
769 return true;
770
771 } else {
772
773 return false;
774 }
775 }
double u[N+1]
Definition JPolint.hh:865

◆ getRotation()

const JRotation3D & JGEOMETRY3D::JRotation3D::getRotation ( ) const
inlineinherited

Get rotation.

Returns
rotation

Definition at line 272 of file JRotation3D.hh.

273 {
274 return static_cast<const JRotation3D&>(*this);
275 }
JRotation3D()
Default constructor (= identity matrix).

◆ operator JQuaternion3D()

JGEOMETRY3D::JRotation3D::operator JQuaternion3D ( ) const
inlineinherited

Type conversion operator.

Returns
quaternion

Definition at line 283 of file JRotation3D.hh.

284 {
285 const double q2 = 0.25 * (1.0 + a00 + a11 + a22);
286
287 if (q2 > 0.0) {
288
289 const double a = sqrt(q2);
290 const double w = 0.25 / a;
291 const double b = (a21 - a12) * w;
292 const double c = (a02 - a20) * w;
293 const double d = (a10 - a01) * w;
294
295 return JQuaternion3D(a,b,c,d).normalise();
296 }
297
298 return JQuaternion3D(1.0, 0.0, 0.0, 0.0);
299 }
const double a
data_type w[N+1][M+1]
Definition JPolint.hh:867

◆ transpose()

JRotation3D & JGEOMETRY3D::JRotation3D::transpose ( )
inlineinherited

Transpose.

Definition at line 305 of file JRotation3D.hh.

306 {
307 static_cast<JMatrix3D&>(*this).transpose();
308
309 return *this;
310 }
JMatrix3D()
Default constructor.

◆ mul() [1/5]

JRotation3D & JGEOMETRY3D::JRotation3D::mul ( const JRotation3D & A,
const JRotation3D & B )
inlineinherited

Matrix multiplication.

Parameters
Amatrix
Bmatrix
Returns
this matrix

Definition at line 320 of file JRotation3D.hh.

322 {
323 static_cast<JMatrix3D&>(*this).mul(A, B);
324
325 return *this;
326 }

◆ mul() [2/5]

JMatrix3D & JMATH::JMatrix3D::mul ( const double factor)
inlineinherited

Scale matrix.

Parameters
factorfactor
Returns
this matrix * factor

Definition at line 208 of file JMath/JMatrix3D.hh.

209 {
210 a00 *= factor; a01 *= factor; a02 *= factor;
211 a10 *= factor; a11 *= factor; a12 *= factor;
212 a20 *= factor; a21 *= factor; a22 *= factor;
213
214 return *this;
215 }

◆ mul() [3/5]

JMatrix3D & JMATH::JMatrix3D::mul ( const JMatrix3D & A,
const JMatrix3D & B )
inlineinherited

Matrix multiplication.

Parameters
Amatrix
Bmatrix
Returns
this matrix

Definition at line 241 of file JMath/JMatrix3D.hh.

243 {
244 a00 = A.a00 * B.a00 + A.a01 * B.a10 + A.a02 * B.a20;
245 a01 = A.a00 * B.a01 + A.a01 * B.a11 + A.a02 * B.a21;
246 a02 = A.a00 * B.a02 + A.a01 * B.a12 + A.a02 * B.a22;
247
248 a10 = A.a10 * B.a00 + A.a11 * B.a10 + A.a12 * B.a20;
249 a11 = A.a10 * B.a01 + A.a11 * B.a11 + A.a12 * B.a21;
250 a12 = A.a10 * B.a02 + A.a11 * B.a12 + A.a12 * B.a22;
251
252 a20 = A.a20 * B.a00 + A.a21 * B.a10 + A.a22 * B.a20;
253 a21 = A.a20 * B.a01 + A.a21 * B.a11 + A.a22 * B.a21;
254 a22 = A.a20 * B.a02 + A.a21 * B.a12 + A.a22 * B.a22;
255
256 return *this;
257 }

◆ mul() [4/5]

JMatrix3D & JMATH::JMath< JMatrix3D, JSecond_t >::mul ( const JSecond_t & object)
inlineinherited

Multiply with object.

Parameters
objectobject
Returns
result object

Definition at line 354 of file JMath.hh.

355 {
356 return static_cast<JFirst_t&>(*this) = JFirst_t().mul(static_cast<const JFirst_t&>(*this), object);
357 }

◆ mul() [5/5]

template<class JFirst_t , class JSecond_t >
JFirst_t & JMATH::JMath< JFirst_t, JSecond_t >::mul ( const JSecond_t & object)
inlineinherited

Multiply with object.

Parameters
objectobject
Returns
result object

Definition at line 354 of file JMath.hh.

355 {
356 return static_cast<JFirst_t&>(*this) = JFirst_t().mul(static_cast<const JFirst_t&>(*this), object);
357 }

◆ rotate()

void JGEOMETRY3D::JRotation3D::rotate ( double & __x,
double & __y,
double & __z ) const
inlineinherited

Rotate.

Parameters
__xx value
__yy value
__zz value

Definition at line 336 of file JRotation3D.hh.

337 {
338 const double x = a00 * __x + a01 * __y + a02 * __z;
339 const double y = a10 * __x + a11 * __y + a12 * __z;
340 const double z = a20 * __x + a21 * __y + a22 * __z;
341
342 __x = x;
343 __y = y;
344 __z = z;
345 }

◆ rotate_back()

void JGEOMETRY3D::JRotation3D::rotate_back ( double & __x,
double & __y,
double & __z ) const
inlineinherited

Rotate back.

Parameters
__xx value
__yy value
__zz value

Definition at line 355 of file JRotation3D.hh.

356 {
357 const double x = a00 * __x + a10 * __y + a20 * __z;
358 const double y = a01 * __x + a11 * __y + a21 * __z;
359 const double z = a02 * __x + a12 * __y + a22 * __z;
360
361 __x = x;
362 __y = y;
363 __z = z;
364 }

◆ getInstance()

static const JMatrix3D & JMATH::JMatrix3D::getInstance ( )
inlinestaticinherited

Get reference to unique instance of this class object.

Returns
zero matrix

Definition at line 78 of file JMath/JMatrix3D.hh.

79 {
80 static JMatrix3D matrix;
81
82 return matrix;
83 }

◆ setIdentity()

JMatrix3D & JMATH::JMatrix3D::setIdentity ( )
inlineinherited

Set to identity matrix.

Returns
this matrix

Definition at line 91 of file JMath/JMatrix3D.hh.

92 {
93 a00 = 1.0; a01 = 0.0; a02 = 0.0;
94 a10 = 0.0; a11 = 1.0; a12 = 0.0;
95 a20 = 0.0; a21 = 0.0; a22 = 1.0;
96
97 return *this;
98 }

◆ getIdentity()

static const JMatrix3D & JMATH::JMatrix3D::getIdentity ( )
inlinestaticinherited

Get reference to unique instance of this class object.

Returns
identity matrix

Definition at line 106 of file JMath/JMatrix3D.hh.

107 {
108 static JMatrix3D matrix(JMatrix3D().setIdentity());
109
110 return matrix;
111 }

◆ set()

void JMATH::JMatrix3D::set ( const JMatrix3D & A)
inlineinherited

Set matrix.

Parameters
Amatrix

Definition at line 119 of file JMath/JMatrix3D.hh.

120 {
121 static_cast<JMatrix3D&>(*this) = A;
122 }

◆ reset()

JMatrix3D & JMATH::JMatrix3D::reset ( )
inlineinherited

Set matrix to the null matrix.

Returns
this matrix

Definition at line 130 of file JMath/JMatrix3D.hh.

131 {
132 *this = JMatrix3D();
133
134 return *this;
135 }

◆ negate()

JMatrix3D & JMATH::JMatrix3D::negate ( )
inlineinherited

Negate matrix.

Returns
-this matrix

Definition at line 160 of file JMath/JMatrix3D.hh.

161 {
162 a00 = -a00; a01 = -a01; a02 = -a02;
163 a10 = -a10; a11 = -a11; a12 = -a12;
164 a20 = -a20; a21 = -a21; a22 = -a22;
165
166 return *this;
167 }

◆ add()

JMatrix3D & JMATH::JMatrix3D::add ( const JMatrix3D & A)
inlineinherited

Matrix addition.

Parameters
Amatrix
Returns
this matrix + A

Definition at line 176 of file JMath/JMatrix3D.hh.

177 {
178 a00 += A.a00; a01 += A.a01; a02 += A.a02;
179 a10 += A.a10; a11 += A.a11; a12 += A.a12;
180 a20 += A.a20; a21 += A.a21; a22 += A.a22;
181
182 return *this;
183 }

◆ sub()

JMatrix3D & JMATH::JMatrix3D::sub ( const JMatrix3D & A)
inlineinherited

Matrix subtraction.

Parameters
Amatrix
Returns
this matrix - A

Definition at line 192 of file JMath/JMatrix3D.hh.

193 {
194 a00 -= A.a00; a01 -= A.a01; a02 -= A.a02;
195 a10 -= A.a10; a11 -= A.a11; a12 -= A.a12;
196 a20 -= A.a20; a21 -= A.a21; a22 -= A.a22;
197
198 return *this;
199 }

◆ div()

JMatrix3D & JMATH::JMatrix3D::div ( const double factor)
inlineinherited

Scale matrix.

Parameters
factorfactor
Returns
this matrix / factor

Definition at line 224 of file JMath/JMatrix3D.hh.

225 {
226 a00 /= factor; a01 /= factor; a02 /= factor;
227 a10 /= factor; a11 /= factor; a12 /= factor;
228 a20 /= factor; a21 /= factor; a22 /= factor;
229
230 return *this;
231 }

◆ equals()

bool JMATH::JMatrix3D::equals ( const JMatrix3D & A,
const double eps = std::numeric_limits<double>::min() ) const
inlineinherited

Equality.

Parameters
Amatrix
epsnumerical precision
Returns
true if matrices identical; else false

Definition at line 267 of file JMath/JMatrix3D.hh.

269 {
270 return (fabs(a00 - A.a00) <= eps &&
271 fabs(a01 - A.a01) <= eps &&
272 fabs(a02 - A.a02) <= eps &&
273 fabs(a10 - A.a10) <= eps &&
274 fabs(a11 - A.a11) <= eps &&
275 fabs(a12 - A.a12) <= eps &&
276 fabs(a20 - A.a20) <= eps &&
277 fabs(a21 - A.a21) <= eps &&
278 fabs(a22 - A.a22) <= eps);
279 }

◆ isIdentity()

bool JMATH::JMatrix3D::isIdentity ( const double eps = std::numeric_limits<double>::min()) const
inlineinherited

Test identity.

Parameters
epsnumerical precision
Returns
true if identity matrix; else false

Definition at line 288 of file JMath/JMatrix3D.hh.

289 {
290 return equals(getIdentity(), eps);
291 }
static const JMatrix3D & getIdentity()
Get reference to unique instance of this class object.
bool equals(const JMatrix3D &A, const double eps=std::numeric_limits< double >::min()) const
Equality.

◆ getDeterminant()

double JMATH::JMatrix3D::getDeterminant ( ) const
inlineinherited

Get determinant of matrix.

Returns
determinant of matrix

Definition at line 299 of file JMath/JMatrix3D.hh.

300 {
301 double det = 0.0;
302
303 det += a00 * (a11 * a22 - a21 * a12);
304 det -= a01 * (a10 * a22 - a20 * a12);
305 det += a02 * (a10 * a21 - a20 * a11);
306
307 return det;
308 }

◆ transform()

void JMATH::JMatrix3D::transform ( double & __x,
double & __y,
double & __z ) const
inlineinherited

Transform.

Parameters
__xx value
__yy value
__zz value

Definition at line 318 of file JMath/JMatrix3D.hh.

319 {
320 const double x = a00 * __x + a01 * __y + a02 * __z;
321 const double y = a10 * __x + a11 * __y + a12 * __z;
322 const double z = a20 * __x + a21 * __y + a22 * __z;
323
324 __x = x;
325 __y = y;
326 __z = z;
327 }

Member Data Documentation

◆ NUMBER_OF_DIMENSIONS

const size_t JDETECTOR::JRotation::NUMBER_OF_DIMENSIONS = 3
static

Number of dimensions.

Definition at line 669 of file JDetectorToolkit.hh.

◆ in

std::vector<JVector3D> JDETECTOR::JRotation::in
private

Definition at line 778 of file JDetectorToolkit.hh.

◆ out

std::vector<JVector3D> JDETECTOR::JRotation::out
private

Definition at line 779 of file JDetectorToolkit.hh.

◆ a00

double JMATH::JMatrix3D::a00
inherited

Definition at line 385 of file JMath/JMatrix3D.hh.

◆ a01

double JMATH::JMatrix3D::a01
inherited

Definition at line 385 of file JMath/JMatrix3D.hh.

◆ a02

double JMATH::JMatrix3D::a02
inherited

Definition at line 385 of file JMath/JMatrix3D.hh.

◆ a10

double JMATH::JMatrix3D::a10
inherited

Definition at line 386 of file JMath/JMatrix3D.hh.

◆ a11

double JMATH::JMatrix3D::a11
inherited

Definition at line 386 of file JMath/JMatrix3D.hh.

◆ a12

double JMATH::JMatrix3D::a12
inherited

Definition at line 386 of file JMath/JMatrix3D.hh.

◆ a20

double JMATH::JMatrix3D::a20
inherited

Definition at line 387 of file JMath/JMatrix3D.hh.

◆ a21

double JMATH::JMatrix3D::a21
inherited

Definition at line 387 of file JMath/JMatrix3D.hh.

◆ a22

double JMATH::JMatrix3D::a22
inherited

Definition at line 387 of file JMath/JMatrix3D.hh.


The documentation for this struct was generated from the following file: