#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. | |
DDRotationMatrix * | DDcreateRotationMatrix (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) |
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; }