Import Geant4 9.5.0 source tree
This commit is contained in:
@@ -0,0 +1,399 @@
|
||||
// -*- C++ -*-
|
||||
// CLASSDOC OFF
|
||||
// ---------------------------------------------------------------------------
|
||||
// CLASSDOC ON
|
||||
//
|
||||
// This file is a part of the CLHEP - a Class Library for High Energy Physics.
|
||||
//
|
||||
// This contains the definition of two abstract interface classes:
|
||||
// Hep4RotationInterface
|
||||
// Hep3RotationInterface.
|
||||
// However, these are mostly for defining methods which should be present in
|
||||
// any 4- or 3-rotation class, however specialized. The actual classes do
|
||||
// not inherit from these. The virtual function overhead turns out
|
||||
// to be too steep for that to be practical.
|
||||
//
|
||||
// It may be desirable in the future to turn these classes into constraints
|
||||
// in the Stroustrup sense, so as to enforce this interface, still without
|
||||
// inheritance. However, they do contain an important static:
|
||||
// static double tolerance to set criteria for relative nearness.
|
||||
//
|
||||
// This file also defines structs
|
||||
// HepRep3x3;
|
||||
// HepRep4x4;
|
||||
// HepRep4x4Symmetric;
|
||||
// which are used by various Rotation classes.
|
||||
//
|
||||
// Hep4RotationInterface
|
||||
// contains all the methods to get attributes of either a
|
||||
// HepLorentzRotation or a HepRotation -- any information
|
||||
// that pertains to a LorentzRotation can also be defined
|
||||
// for a HepRotation.(For example, the 4x4 representation
|
||||
// would just have 0's in the space-time entries and 1 in
|
||||
// the time-time entry.)
|
||||
//
|
||||
// Hep3RotationInterface
|
||||
// inherits from Hep4RotationInterface, and adds methods
|
||||
// which are well-defined only in the case of a Rotation.
|
||||
// For example, a 3x3 representation is an attribute only
|
||||
// if the generic LorentzRotation involves no boost.
|
||||
//
|
||||
// In terms of classes in the ZOOM PhysicsVectors package,
|
||||
// Hep4RotationInterface <--> LorentzTransformationInterface
|
||||
// Hep3RotationInterface <--> RotationInterface
|
||||
//
|
||||
// Hep4RotationInterface defines the required methods for:
|
||||
// HepLorentzRotation
|
||||
// HepBoost
|
||||
// HepBoostX
|
||||
// HepBoostY
|
||||
// HepBoostZ
|
||||
//
|
||||
// Hep3RotationInterface defines the required methods for:
|
||||
// HepRotation
|
||||
// HepRotationX
|
||||
// HepRotationY
|
||||
// HepRotationZ
|
||||
//
|
||||
// .SS See Also
|
||||
// Rotation.h, LorentzRotation.h
|
||||
//
|
||||
// .SS Author
|
||||
// Mark Fischler
|
||||
//
|
||||
|
||||
#ifndef HEP_ROTATION_INTERFACES_H
|
||||
#define HEP_ROTATION_INTERFACES_H
|
||||
|
||||
#include "CLHEP/Vector/ThreeVector.h"
|
||||
#include "CLHEP/Vector/LorentzVector.h"
|
||||
#include "CLHEP/Vector/AxisAngle.h"
|
||||
|
||||
namespace CLHEP {
|
||||
|
||||
struct HepRep3x3;
|
||||
struct HepRep4x4;
|
||||
struct HepRep4x4Symmetric;
|
||||
|
||||
class HepRotation;
|
||||
class HepRotationX;
|
||||
class HepRotationY;
|
||||
class HepRotationZ;
|
||||
class HepLorentzRotation;
|
||||
class HepBoost;
|
||||
class HepBoostX;
|
||||
class HepBoostY;
|
||||
class HepBoostZ;
|
||||
|
||||
//-******************************
|
||||
//
|
||||
// Hep4RotationInterface
|
||||
//
|
||||
//-******************************
|
||||
|
||||
/**
|
||||
* @author
|
||||
* @ingroup vector
|
||||
*/
|
||||
class Hep4RotationInterface {
|
||||
|
||||
// All attributes of shared by HepLorentzRotation, HepBoost,
|
||||
// HepBoostX, HepBoostY, HepBoostZ. HepRotation, HepRotationX,
|
||||
// HepRotationY, HepRotationZ also share this attribute interface.
|
||||
|
||||
friend class HepRotation;
|
||||
friend class HepRotationX;
|
||||
friend class HepRotationY;
|
||||
friend class HepRotationZ;
|
||||
friend class HepLorentzRotation;
|
||||
friend class HepBoost;
|
||||
friend class HepBoostX;
|
||||
friend class HepBoostY;
|
||||
friend class HepBoostZ;
|
||||
|
||||
public:
|
||||
|
||||
DLL_API static double tolerance; // to determine relative nearness
|
||||
|
||||
// ---------- Accessors:
|
||||
|
||||
#ifdef ONLY_IN_CONCRETE_CLASSES
|
||||
// orthosymplectic 4-vectors:
|
||||
HepLorentzVector col1() const;
|
||||
HepLorentzVector col2() const;
|
||||
HepLorentzVector col3() const;
|
||||
HepLorentzVector col4() const;
|
||||
HepLorentzVector row1() const;
|
||||
HepLorentzVector row2() const;
|
||||
HepLorentzVector row3() const;
|
||||
HepLorentzVector row4() const;
|
||||
|
||||
// individual elements:
|
||||
double xx() const ;
|
||||
double xy() const ;
|
||||
double xz() const ;
|
||||
double xt() const ;
|
||||
double yx() const ;
|
||||
double yy() const ;
|
||||
double yz() const ;
|
||||
double yt() const ;
|
||||
double zx() const ;
|
||||
double zy() const ;
|
||||
double zz() const ;
|
||||
double zt() const ;
|
||||
double tx() const ;
|
||||
double ty() const ;
|
||||
double tz() const ;
|
||||
double tt() const ;
|
||||
|
||||
// 4x4 representation:
|
||||
//HepRep4x4 rep4x4() const; JMM Declared here but not defined anywhere!
|
||||
|
||||
// ---------- Operations:
|
||||
// comparisons:
|
||||
|
||||
inline int compare( const Hep4RotationInterface & lt ) const;
|
||||
// Dictionary-order comparisons, utilizing the decompose(b,r) method
|
||||
|
||||
// decomposition:
|
||||
|
||||
void decompose (HepAxisAngle & rotation, Hep3Vector & boost)const;
|
||||
// Decompose as T= R * B, where R is pure rotation, B is pure boost.
|
||||
|
||||
void decompose (Hep3Vector & boost, HepAxisAngle & rotation)const;
|
||||
// Decompose as T= B * R, where R is pure rotation, B is pure boost.
|
||||
|
||||
bool operator == (const Hep4RotationInterface & r) const;
|
||||
bool operator != (const Hep4RotationInterface & r) const;
|
||||
|
||||
// relative comparison:
|
||||
|
||||
double norm2() const ;
|
||||
double distance2( const Hep4RotationInterface & lt ) const ;
|
||||
double howNear( const Hep4RotationInterface & lt ) const ;
|
||||
bool isNear (const Hep4RotationInterface & lt,
|
||||
double epsilon=tolerance) const ;
|
||||
|
||||
void rectify() ;
|
||||
// non-const but logically const correction for accumulated roundoff errors
|
||||
|
||||
// ---------- Apply LorentzTransformations:
|
||||
|
||||
HepLorentzVector operator* ( const HepLorentzVector & w ) const ;
|
||||
HepLorentzVector operator()( const HepLorentzVector & w ) const ;
|
||||
// Apply to a 4-vector
|
||||
|
||||
// ---------- I/O:
|
||||
|
||||
std::ostream & print( std::ostream & os ) const;
|
||||
|
||||
#endif /* ONLY_IN_CONCRETE_CLASSES */
|
||||
|
||||
static double getTolerance();
|
||||
static double setTolerance( double tol );
|
||||
|
||||
enum { ToleranceTicks = 100 };
|
||||
|
||||
protected:
|
||||
|
||||
~Hep4RotationInterface() {} // protect destructor to forbid instatiation
|
||||
|
||||
}; // Hep4RotationInterface
|
||||
|
||||
|
||||
//-******************************
|
||||
//
|
||||
// Hep3RotationInterface
|
||||
//
|
||||
//-******************************
|
||||
|
||||
/**
|
||||
* @author
|
||||
* @ingroup vector
|
||||
*/
|
||||
class Hep3RotationInterface : public Hep4RotationInterface {
|
||||
|
||||
// All attributes of HepRotation, HepRotationX, HepRotationY, HepRotationZ
|
||||
// beyond those available by virtue of being a Hep3RotationInterface.
|
||||
|
||||
friend class HepRotation;
|
||||
friend class HepRotationX;
|
||||
friend class HepRotationY;
|
||||
friend class HepRotationZ;
|
||||
|
||||
public:
|
||||
|
||||
#ifdef ONLY_IN_CONCRETE_CLASSES
|
||||
|
||||
// Euler angles:
|
||||
double getPhi () const ;
|
||||
double getTheta() const ;
|
||||
double getPsi () const ;
|
||||
double phi () const ;
|
||||
double theta() const ;
|
||||
double psi () const ;
|
||||
HepEulerAngles eulerAngles() const ;
|
||||
|
||||
// axis & angle of rotation:
|
||||
double getDelta() const ;
|
||||
Hep3Vector getAxis () const ;
|
||||
double delta() const ;
|
||||
Hep3Vector axis () const ;
|
||||
HepAxisAngle axisAngle() const ;
|
||||
|
||||
// orthogonal unit-length vectors:
|
||||
Hep3Vector rowX() const;
|
||||
Hep3Vector rowY() const;
|
||||
Hep3Vector rowZ() const;
|
||||
|
||||
Hep3Vector colX() const;
|
||||
Hep3Vector colY() const;
|
||||
Hep3Vector colZ() const;
|
||||
|
||||
//HepRep3x3 rep3x3() const; JMM Declared here but not defined anywhere!
|
||||
// 3x3 representation
|
||||
|
||||
// orthosymplectic 4-vectors treating this as a 4-rotation:
|
||||
HepLorentzVector col1() const;
|
||||
HepLorentzVector col2() const;
|
||||
HepLorentzVector col3() const;
|
||||
HepLorentzVector col4() const;
|
||||
HepLorentzVector row1() const;
|
||||
HepLorentzVector row2() const;
|
||||
HepLorentzVector row3() const;
|
||||
HepLorentzVector row4() const;
|
||||
|
||||
// individual elements treating this as a 4-rotation:
|
||||
double xt() const;
|
||||
double yt() const;
|
||||
double zt() const;
|
||||
double tx() const;
|
||||
double ty() const;
|
||||
double tz() const;
|
||||
double tt() const;
|
||||
|
||||
// ---------- Operations in the Rotation group
|
||||
|
||||
HepRotation operator * ( const Hep3RotationInterface & r ) const ;
|
||||
|
||||
// ---------- Application
|
||||
|
||||
HepLorentzVector operator* ( const HepLorentzVector & w ) const ;
|
||||
HepLorentzVector operator()( const HepLorentzVector & w ) const ;
|
||||
// apply to HepLorentzVector
|
||||
|
||||
Hep3Vector operator* ( const Hep3Vector & v ) const ;
|
||||
Hep3Vector operator()( const Hep3Vector & v ) const ;
|
||||
// apply to Hep3Vector
|
||||
|
||||
// ---------- I/O and a helper method
|
||||
|
||||
std::ostream & print( std::ostream & os ) const;
|
||||
|
||||
#endif /* ONLY_IN_CONCRETE_CLASSES */
|
||||
|
||||
private:
|
||||
|
||||
~Hep3RotationInterface() {} // private destructor to forbid instatiation
|
||||
|
||||
}; // Hep3RotationInterface
|
||||
|
||||
//-***************************
|
||||
// 3x3 and 4x4 representations
|
||||
//-***************************
|
||||
|
||||
struct HepRep3x3 {
|
||||
|
||||
// ----- Constructors:
|
||||
|
||||
inline HepRep3x3();
|
||||
|
||||
inline HepRep3x3( double xx, double xy, double xz
|
||||
, double yx, double yy, double yz
|
||||
, double zx, double zy, double zz
|
||||
);
|
||||
|
||||
inline HepRep3x3( const double * array );
|
||||
// construct from an array of doubles, holding the rotation matrix
|
||||
// in ROW order (xx, xy, ...)
|
||||
|
||||
inline void setToIdentity();
|
||||
|
||||
// ----- The data members are public:
|
||||
double xx_, xy_, xz_,
|
||||
yx_, yy_, yz_,
|
||||
zx_, zy_, zz_;
|
||||
|
||||
inline void getArray ( double * array ) const;
|
||||
// fill array with the NINE doubles xx, xy, xz ... zz
|
||||
|
||||
}; // HepRep3x3
|
||||
|
||||
struct HepRep4x4 {
|
||||
|
||||
// ----- Constructors:
|
||||
inline HepRep4x4();
|
||||
|
||||
inline HepRep4x4( double xx, double xy, double xz, double xt
|
||||
, double yx, double yy, double yz, double yt
|
||||
, double zx, double zy, double zz, double zt
|
||||
, double tx, double ty, double tz, double tt
|
||||
);
|
||||
|
||||
inline HepRep4x4( const HepRep4x4Symmetric & rep );
|
||||
|
||||
inline HepRep4x4( const double * array );
|
||||
// construct from an array of doubles, holding the transformation matrix
|
||||
// in ROW order xx, xy, ...
|
||||
|
||||
inline void setToIdentity();
|
||||
|
||||
// ----- The data members are public:
|
||||
double xx_, xy_, xz_, xt_,
|
||||
yx_, yy_, yz_, yt_,
|
||||
zx_, zy_, zz_, zt_,
|
||||
tx_, ty_, tz_, tt_;
|
||||
|
||||
inline void getArray ( double * array ) const;
|
||||
// fill array with the SIXTEEN doubles xx, xy, xz ... tz, tt
|
||||
|
||||
inline bool operator==(HepRep4x4 const & r) const;
|
||||
inline bool operator!=(HepRep4x4 const & r) const;
|
||||
|
||||
|
||||
}; // HepRep4x4
|
||||
|
||||
struct HepRep4x4Symmetric {
|
||||
|
||||
// ----- Constructors:
|
||||
|
||||
inline HepRep4x4Symmetric();
|
||||
|
||||
inline HepRep4x4Symmetric
|
||||
( double xx, double xy, double xz, double xt
|
||||
, double yy, double yz, double yt
|
||||
, double zz, double zt
|
||||
, double tt );
|
||||
|
||||
inline HepRep4x4Symmetric( const double * array );
|
||||
// construct from an array of doubles, holding the transformation matrix
|
||||
// elements in this order: xx, xy, xz, xt, yy, yz, yt, zz, zt, tt
|
||||
|
||||
inline void setToIdentity();
|
||||
|
||||
// ----- The data members are public:
|
||||
double xx_, xy_, xz_, xt_,
|
||||
yy_, yz_, yt_,
|
||||
zz_, zt_,
|
||||
tt_;
|
||||
|
||||
inline void getArray ( double * array ) const;
|
||||
// fill array with the TEN doubles xx, xy, xz, xt, yy, yz, yt, zz, zt, tt
|
||||
|
||||
};
|
||||
|
||||
} // namespace CLHEP
|
||||
|
||||
#include "CLHEP/Vector/RotationInterfaces.icc"
|
||||
|
||||
#endif // ROTATION_INTERFACES_H
|
||||
Reference in New Issue
Block a user