13 #pragma implementation 
   16 #include "CLHEP/Vector/Rotation.h" 
   24 bool HepRotation::setCols 
 
   25     ( 
const Hep3Vector & u1, 
const Hep3Vector & u2, 
const Hep3Vector & u3,
 
   27       Hep3Vector & v1, Hep3Vector & v2, Hep3Vector & v3 )
 const {
 
   29   if ( (1-std::fabs(u1u2)) <= Hep4RotationInterface::tolerance ) {
 
   30     std::cerr << 
"HepRotation::setCols() - " 
   31       << 
"All three cols supplied for a Rotation are parallel --" 
   32       << 
"\n    an arbitrary rotation will be returned" << std::endl;
 
   33     setArbitrarily (u1, v1, v2, v3);
 
   38   v2  = Hep3Vector(u2 - u1u2 * u1).unit();
 
   40   if ( v3.dot(u3) >= 0 ) {
 
   48 void HepRotation::setArbitrarily (
const Hep3Vector & ccolX, 
 
   49    Hep3Vector & v1, Hep3Vector & v2, Hep3Vector & v3)
 const {
 
   55   v2 = v1.cross(Hep3Vector(0,0,1));
 
   59     v2 = Hep3Vector(1,0,0);
 
   73 HepRotation & HepRotation::set( 
const Hep3Vector & ccolX,
 
   74                                 const Hep3Vector & ccolY,
 
   75                                 const Hep3Vector & ccolZ ) {
 
   76   Hep3Vector ucolX = ccolX.unit();
 
   77   Hep3Vector ucolY = ccolY.unit();
 
   78   Hep3Vector ucolZ = ccolZ.unit();
 
   80   double u1u2 = ucolX.dot(ucolY);
 
   81   double f12  = std::fabs(u1u2);
 
   82   if ( f12 > Hep4RotationInterface::tolerance ) {
 
   83     std::cerr << 
"HepRotation::set() - " 
   84       << 
"col's X and Y supplied for Rotation are not close to orthogonal" 
   87   double u1u3 = ucolX.dot(ucolZ);
 
   88   double f13  = std::fabs(u1u3);
 
   89   if ( f13 > Hep4RotationInterface::tolerance ) {
 
   90     std::cerr << 
"HepRotation::set() - " 
   91       << 
"col's X and Z supplied for Rotation are not close to orthogonal" 
   94   double u2u3 = ucolY.dot(ucolZ);
 
   95   double f23  = std::fabs(u2u3);
 
   96   if ( f23 > Hep4RotationInterface::tolerance ) {
 
   97     std::cerr << 
"HepRotation::set() - " 
   98       << 
"col's Y and Z supplied for Rotation are not close to orthogonal" 
  102   Hep3Vector v1, v2, v3;
 
  104   if ( (f12 <= f13) && (f12 <= f23) ) {
 
  105     isRotation = setCols ( ucolX, ucolY, ucolZ, u1u2, v1, v2, v3 );
 
  107       std::cerr << 
"HepRotation::set() - " 
  108         << 
"col's X Y and Z supplied form closer to a reflection than a Rotation " 
  109         << 
"\n     col Z is set to col X cross col Y" << std::endl;
 
  111   } 
else if ( f13 <= f23 ) {
 
  112     isRotation = setCols ( ucolZ, ucolX, ucolY, u1u3, v3, v1, v2 );
 
  114       std::cerr << 
"HepRotation::set() - " 
  115         << 
"col's X Y and Z supplied form closer to a reflection than a Rotation " 
  116         << 
"\n     col Y is set to col Z cross col X" << std::endl;
 
  119     isRotation = setCols ( ucolY, ucolZ, ucolX, u2u3, v2, v3, v1 );
 
  121       std::cerr << 
"HepRotation::set() - " 
  122         << 
"col's X Y and Z supplied form closer to a reflection than a Rotation " 
  123         << 
"\n     col X is set to col Y cross col Z" << std::endl;
 
  127   rxx = v1.x();  ryx = v1.y(); rzx = v1.z();
 
  128   rxy = v2.x();  ryy = v2.y(); rzy = v2.z();
 
  129   rxz = v3.x();  ryz = v3.y(); rzz = v3.z();
 
  135 HepRotation::HepRotation ( 
const Hep3Vector & ccolX,
 
  136                            const Hep3Vector & ccolY,
 
  137                            const Hep3Vector & ccolZ ) 
 
  139   set (ccolX, ccolY, ccolZ);
 
  142 HepRotation & HepRotation::setRows( 
const Hep3Vector & rrowX,
 
  143                                     const Hep3Vector & rrowY,
 
  144                                     const Hep3Vector & rrowZ ) {
 
  145   set (rrowX, rrowY, rrowZ);
 
  152 void HepRotation::rectify() {
 
  163   double det =  rxx * ryy * rzz +
 
  170     std::cerr << 
"HepRotation::rectify() - " 
  171         << 
"Attempt to rectify a Rotation with determinant <= 0" << std::endl;
 
  174   double di = 1.0 / det;
 
  177   double xx1 = (ryy * rzz - ryz * rzy) * di;
 
  178   double xy1 = (rzy * rxz - rzz * rxy) * di;
 
  179   double xz1 = (rxy * ryz - rxz * ryy) * di;
 
  180   double yx1 = (ryz * rzx - ryx * rzz) * di;
 
  181   double yy1 = (rzz * rxx - rzx * rxz) * di;
 
  182   double yz1 = (rxz * ryx - rxx * ryz) * di;
 
  183   double zx1 = (ryx * rzy - ryy * rzx) * di;
 
  184   double zy1 = (rzx * rxy - rzy * rxx) * di;
 
  185   double zz1 = (rxx * ryy - rxy * ryx) * di;
 
  188   rxx = .5*(rxx + xx1);
 
  189   rxy = .5*(rxy + yx1);
 
  190   rxz = .5*(rxz + zx1);
 
  191   ryx = .5*(ryx + xy1);
 
  192   ryy = .5*(ryy + yy1);
 
  193   ryz = .5*(ryz + zy1);
 
  194   rzx = .5*(rzx + xz1);
 
  195   rzy = .5*(rzy + yz1);
 
  196   rzz = .5*(rzz + zz1);
 
  199   double del = delta();
 
  200   Hep3Vector u = axis();