10 #pragma implementation 
   13 #include "CLHEP/Vector/LorentzRotation.h" 
   19 void HepLorentzRotation::decompose 
 
   20         (HepBoost & bboost, HepRotation & rotation)
 const {
 
   27   Hep3Vector betaVec ( xt(), yt(), zt() );
 
   28   betaVec *= 1.0 / tt();
 
   29   bboost.set( betaVec );
 
   33   HepBoost B( -betaVec );
 
   34   HepLorentzRotation R( B * *
this );
 
   36   HepRep3x3 m1  ( R.xx(), R.xy(), R.xz(),
 
   37                   R.yx(), R.yy(), R.yz(),
 
   38                   R.zx(), R.zy(), R.zz() );
 
   46 void HepLorentzRotation::decompose 
 
   47         (Hep3Vector & bboost, HepAxisAngle & rotation)
 const {
 
   51   bboost = b.boostVector();
 
   52   rotation = r.axisAngle();
 
   56 void HepLorentzRotation::decompose 
 
   57         (HepRotation & rotation, HepBoost & bboost)
 const {
 
   61   Hep3Vector betaVec( tx(), ty(), tz() );
 
   62   betaVec *= 1.0 / tt();
 
   63   bboost.set( betaVec );
 
   67   HepBoost B( -betaVec );
 
   68   HepLorentzRotation R( *
this * B );
 
   70   HepRep3x3 m1 ( R.xx(), R.xy(), R.xz(),
 
   71                  R.yx(), R.yy(), R.yz(),
 
   72                  R.zx(), R.zy(), R.zz() );
 
   79 void HepLorentzRotation::decompose 
 
   80         (HepAxisAngle & rotation, Hep3Vector & bboost)
 const {
 
   84   rotation = r.axisAngle();
 
   85   bboost = b.boostVector();
 
   89 double HepLorentzRotation::distance2( 
const HepBoost & b )
 const {
 
   93   double db2 = b1.distance2( b );
 
   94   double dr2 = r1.norm2(); 
 
   98 double HepLorentzRotation::distance2( 
const HepRotation & r )
 const {
 
  102   double db2 = b1.norm2( );
 
  103   double dr2 = r1.distance2( r ); 
 
  104   return ( db2 + dr2 );
 
  107 double HepLorentzRotation::distance2( 
 
  108                                    const HepLorentzRotation & lt  )
 const {
 
  114   lt.decompose (b2, r2);
 
  115   double db2 = b1.distance2( b2 );
 
  116   double dr2 = r1.distance2( r2 ); 
 
  117   return ( db2 + dr2 );
 
  120 double HepLorentzRotation::howNear( 
const HepBoost & b )
 const {
 
  121   return std::sqrt( distance2( b ) );
 
  123 double HepLorentzRotation::howNear( 
const HepRotation & r )
 const {
 
  124   return std::sqrt( distance2( r ) );
 
  126 double HepLorentzRotation::howNear( 
const HepLorentzRotation & lt )
const {
 
  127   return std::sqrt( distance2( lt ) );
 
  130 bool HepLorentzRotation::isNear(
 
  131                 const HepBoost & b, 
double epsilon )
 const {
 
  135   double db2 = b1.distance2(b);
 
  136   if ( db2 > epsilon*epsilon ) {
 
  139   double dr2 = r1.norm2();
 
  140   return ( (db2 + dr2) <= epsilon*epsilon );
 
  143 bool HepLorentzRotation::isNear(
 
  144                 const HepRotation & r, 
double epsilon )
 const {
 
  148   double db2 = b1.norm2();
 
  149   if ( db2 > epsilon*epsilon ) {
 
  152   double dr2 = r1.distance2(r);
 
  153   return ( (db2 + dr2) <= epsilon*epsilon );
 
  156 bool HepLorentzRotation::isNear(
 
  157                 const HepLorentzRotation & lt, 
double epsilon )
 const {
 
  163   lt.decompose (b2, r2);
 
  164   double db2 = b1.distance2(b2);
 
  165   if ( db2 > epsilon*epsilon ) {
 
  168   double dr2 = r1.distance2(r2);
 
  169   return ( (db2 + dr2) <= epsilon*epsilon );
 
  172 double HepLorentzRotation::norm2()
 const {
 
  176   return b.norm2() + r.norm2();
 
  179 void HepLorentzRotation::rectify() {
 
  191   Hep3Vector beta (tx(), ty(), tz());
 
  194     std::cerr << 
"HepLorentzRotation::rectify() - " 
  195         << 
"rectify() on a transformation with tt() <= 0 - will not help!" 
  200   HepLorentzRotation R = (*this) * HepBoost(-beta);
 
  202   HepRep3x3  m1 ( R.xx(), R.xy(), R.xz(),
 
  203                   R.yx(), R.yy(), R.yz(),
 
  204                   R.zx(), R.zy(), R.zz() );
 
  206   HepRotation Rgood (m1);
 
  209   set ( Rgood, HepBoost(beta) );