CMS 3D CMS Logo

Functions

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/DetectorDescription/Core/src/DDRotation.cc File Reference

#include <cmath>
#include "DetectorDescription/Core/interface/DDTransform.h"
#include "DetectorDescription/Base/interface/DDTranslation.h"
#include "DetectorDescription/Base/interface/DDdebug.h"
#include "CLHEP/Units/GlobalSystemOfUnits.h"
#include <Math/AxisAngle.h>
#include <sstream>
#include <cstdlib>
#include "FWCore/MessageLogger/interface/MessageLogger.h"

Go to the source code of this file.

Functions

DDRotation DDanonymousRot (DDRotationMatrix *rot)
 Defines a anonymous rotation or rotation-reflection matrix.
DDRotationMatrixDDcreateRotationMatrix (double thetaX, double phiX, double thetaY, double phiY, double thetaZ, double phiZ)
 create a new DDRotationMatrix in the GEANT3 style.
DDRotation DDrot (const DDName &ddname, double thetaX, double phiX, double thetaY, double phiY, double thetaZ, double phiZ)
 Definition of a uniquely identifiable rotation matrix named by DDName name in the GEANT3 style.
DDRotation DDrot (const DDName &ddname, DDRotationMatrix *rot)
 Definition of a uniquely identifiable rotation matrix named by DDName name.
DDRotation DDrotReflect (const DDName &ddname, DDRotationMatrix *rot)
DDRotation DDrotReflect (const DDName &ddname, double thetaX, double phiX, double thetaY, double phiY, double thetaZ, double phiZ)
 Defines a rotation-reflection in the Geant3 way.
std::ostream & operator<< (std::ostream &os, const DDRotation &r)

Function Documentation

DDRotation DDanonymousRot ( DDRotationMatrix rot)

Defines a anonymous rotation or rotation-reflection matrix.

It can't be addressed by a unique DDName. Once created, it's the users responsibility to keep the reference object DDRotation! Will be mostly used by algorithmic positioning.

Definition at line 195 of file DDRotation.cc.

Referenced by DDCompactView::algoPosPart(), DDTIBLayerAlgo::execute(), and DDStreamer::pos_read().

{
  return DDRotation(rot);
}
DDRotationMatrix* DDcreateRotationMatrix ( double  thetaX,
double  phiX,
double  thetaY,
double  phiY,
double  thetaZ,
double  phiZ 
)

create a new DDRotationMatrix in the GEANT3 style.

The Matrix must be orthonormal - left or right handed - otherwise a DDException is thrown; memory of the returned pointer belongs to the caller

Definition at line 166 of file DDRotation.cc.

References CastorDataFrameFilter_impl::check(), funct::cos(), Exception, python::connectstrParser::o, funct::sin(), x, detailsBasic3DVector::y, and z.

Referenced by DDTIBLayerAlgo::execute(), and DDAngular::execute().

{
   // define 3 unit std::vectors forming the new left-handed axes 
   DD3Vector x(cos(phiX)*sin(thetaX), sin(phiX)*sin(thetaX), cos(thetaX));
   DD3Vector y(cos(phiY)*sin(thetaY), sin(phiY)*sin(thetaY), cos(thetaY));
   DD3Vector z(cos(phiZ)*sin(thetaZ), sin(phiZ)*sin(thetaZ), cos(thetaZ));
   
   double tol = 1.0e-3; // Geant4 compatible
   double check = (x.Cross(y)).Dot(z);// in case of a LEFT-handed orthogonal system this must be -1, RIGHT-handed: +1
   if ((1.-fabs(check))>tol) {
     std::ostringstream o;
     o << "matrix is not an (left or right handed) orthonormal matrix! (in deg)" << std::endl
       << " thetaX=" << thetaX/deg << " phiX=" << phiX/deg << std::endl
       << " thetaY=" << thetaY/deg << " phiY=" << phiY/deg << std::endl
       << " thetaZ=" << thetaZ/deg << " phiZ=" << phiZ/deg << std::endl;
     edm::LogError("DDRotation") << o.str() << std::endl;
     
     
     throw cms::Exception("DDException") << o.str();
   }
   
   return new DDRotationMatrix(x.x(),y.x(),z.x(),
                               x.y(),y.y(),z.y(),
                               x.z(),y.z(),z.z());
}                        
DDRotation DDrot ( const DDName name,
double  thetaX,
double  phiX,
double  thetaY,
double  phiY,
double  thetaZ,
double  phiZ 
)

Definition of a uniquely identifiable rotation matrix named by DDName name in the GEANT3 style.

DDrot() returns a reference-object DDRotation representing the rotation matrix.

Definition at line 100 of file DDRotation.cc.

References CastorDataFrameFilter_impl::check(), funct::cos(), Exception, DDName::name(), makeMuonMisalignmentScenario::rot, funct::sin(), x, detailsBasic3DVector::y, and z.

{
   // define 3 unit std::vectors
   DD3Vector x(cos(phiX)*sin(thetaX), sin(phiX)*sin(thetaX), cos(thetaX));
   DD3Vector y(cos(phiY)*sin(thetaY), sin(phiY)*sin(thetaY), cos(thetaY));
   DD3Vector z(cos(phiZ)*sin(thetaZ), sin(phiZ)*sin(thetaZ), cos(thetaZ));
   
   double tol = 1.0e-3; // Geant4 compatible
   double check = (x.Cross(y)).Dot(z); // in case of a LEFT-handed orthogonal system this must be -1
   if (fabs(1.-check)>tol) {
     edm::LogError("DDRotation") << ddname << " is not a RIGHT-handed orthonormal matrix!" << std::endl;
     throw cms::Exception("DDException") << ddname.name() << " is not RIGHT-handed!";
   }

   DDRotationMatrix* rot = new DDRotationMatrix(x.x(),y.x(),z.x(),
                                                x.y(),y.y(),z.y(),
                                                x.z(),y.z(),z.z());

   return DDRotation(ddname, rot);  
   
}
DDRotation DDrot ( const DDName ddname,
DDRotationMatrix rot 
)

Definition of a uniquely identifiable rotation matrix named by DDName name.

DDrot() returns a reference-object DDRotation representing the rotation matrix rot.

The user must not free memory allocated for rot!

Definition at line 91 of file DDRotation.cc.

Referenced by WriteOneGeometryFromXML::beginRun(), DDPixFwdBlades::computeNippleParameters(), DDHCalEndcapAlgo::constructGeneralVolume(), DDHCalBarrelAlgo::constructGeneralVolume(), DDPixFwdBlades::execute(), DDTECAxialCableAlgo::execute(), DDHCalAngular::execute(), DDHCalXtalAlgo::execute(), DDHCalTBCableAlgo::execute(), DDPixBarStackLayerAlgo::execute(), DDHCalTBZposAlgo::execute(), DDTECPhiAltAlgo::execute(), DDTECOptoHybAlgo::execute(), DDTIBLayerAlgo_MTCC::execute(), DDLinear::execute(), DDPixBarLayerAlgo::execute(), DDHCalTestBeamAlgo::execute(), DDPixFwdDiskAlgo::execute(), DDTrackerPhiAltAlgo::execute(), DDTIDAxialCableAlgo::execute(), DDGEMAngular::execute(), DDTIBLayerAlgo::execute(), DDPixBarTPGStackLayerAlgo::execute(), DDTIDRingAlgo::execute(), DDTIDModulePosAlgo::execute(), DDTrackerPhiAlgo::execute(), DDTrackerAngular::execute(), DDHCalFibreBundle::execute(), DDPixBarStackTrigLayerAlgo::execute(), DDMuonAngular::execute(), DDAngular::execute(), DDPixBarLayerUpgradeAlgoCoverage::execute(), DDTrackerAngularV1::execute(), DDTECPhiAlgo::execute(), DDPixBarLayerUpgradeAlgo::execute(), DDDividedPolyconePhi::makeDDRotation(), DDDividedConsPhi::makeDDRotation(), DDDividedTubsPhi::makeDDRotation(), DDDividedPolyhedraPhi::makeDDRotation(), DDEcalBarrelNewAlgo::myrot(), DDEcalEndcapAlgo::myrot(), DDEcalBarrelAlgo::myrot(), DDTBH4Algo::myrot(), DDLRotationSequence::processElement(), DDLRotationAndReflection::processElement(), DDLPosPart::processElement(), DDLRotationByAxis::processElement(), regressionTest_first(), and regressionTest_setup().

{
   // memory of rot goes sto DDRotationImpl!!
   //DCOUT('c', "DDrot: new rotation " << ddname);
   //if (rot) rot->invert();
   return DDRotation(ddname, rot);
}
DDRotation DDrotReflect ( const DDName ddname,
DDRotationMatrix rot 
)

Definition at line 126 of file DDRotation.cc.

{
   // memory of rot goes sto DDRotationImpl!!
   //DCOUT('c', "DDrot: new rotation " << ddname);
//    if (rot) rot->invert();
   return DDRotation(ddname, rot);
}
DDRotation DDrotReflect ( const DDName ddname,
double  thetaX,
double  phiX,
double  thetaY,
double  phiY,
double  thetaZ,
double  phiZ 
)

Defines a rotation-reflection in the Geant3 way.

The resulting matrix MUST be a LEFThanded orthonormal system, otherwise a DDException will be thrown!

Definition at line 136 of file DDRotation.cc.

References CastorDataFrameFilter_impl::check(), funct::cos(), Exception, DDName::name(), makeMuonMisalignmentScenario::rot, funct::sin(), x, detailsBasic3DVector::y, and z.

Referenced by DDLRotationAndReflection::processElement().

{
   
   // define 3 unit std::vectors forming the new left-handed axes 
   DD3Vector x(cos(phiX)*sin(thetaX), sin(phiX)*sin(thetaX), cos(thetaX));
   DD3Vector y(cos(phiY)*sin(thetaY), sin(phiY)*sin(thetaY), cos(thetaY));
   DD3Vector z(cos(phiZ)*sin(thetaZ), sin(phiZ)*sin(thetaZ), cos(thetaZ));
   
   double tol = 1.0e-3; // Geant4 compatible
   double check = (x.Cross(y)).Dot(z); // in case of a LEFT-handed orthogonal system this must be -1
   if (fabs(1.+check)>tol) {
     edm::LogError("DDRotation") << ddname << " is not a LEFT-handed orthonormal matrix!" << std::endl;
     throw cms::Exception("DDException") << ddname.name() << " is not LEFT-handed!";
   }
   
   DDRotationMatrix* rot = new DDRotationMatrix(x.x(),y.x(),z.x(),
                                                x.y(),y.y(),z.y(),
                                                x.z(),y.z(),z.z());

   //DCOUT('c', "DDrotReflect: new reflection " << ddname);
   //rot->invert();
   return DDRotation(ddname, rot);  
                                                                                         
}               
std::ostream& operator<< ( std::ostream &  os,
const DDRotation r 
)

Definition at line 19 of file DDRotation.cc.

References DCOUT_V, DDBase< N, C >::isDefined(), submit::rm, and DDRotation::rotation().

{
  DDBase<DDName,DDRotationMatrix*>::def_type defined(r.isDefined());
  if (defined.first) {
    os << *(defined.first) << " ";
    if (defined.second) {
      const DDRotationMatrix & rm = *(r.rotation());
      DDAxisAngle   ra(rm);
      os << "t=" << ra.Axis().Theta()/deg << "deg "
         << "p=" << ra.Axis().Phi()/deg << "deg "
         << "a=" << ra.Angle()/deg << "deg"; 
      DCOUT_V('R', rm);
    }
    else {
      os << "* rotation not defined * ";  
    }
  }  
  else {
    os << "* rotation not declared * ";  
  }  
  return os;
}