File indexing completed on 2024-05-10 02:20:53
0001
0002
0003
0004
0005
0006 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0007 #include "DetectorDescription/Core/interface/DDRotationMatrix.h"
0008 #include "DetectorDescription/Core/interface/DDCurrentNamespace.h"
0009 #include "DetectorDescription/Core/interface/DDSplit.h"
0010 #include "DetectorDescription/Core/interface/DDConstant.h"
0011 #include "DetectorDescription/Core/interface/DDAlgorithm.h"
0012 #include "DetectorDescription/Core/interface/DDAlgorithmFactory.h"
0013 #include "DetectorDescription/Core/interface/DDTransform.h"
0014 #include <CLHEP/Vector/ThreeVector.h>
0015 #include <CLHEP/Vector/Rotation.h>
0016 #include <CLHEP/Vector/RotationInterfaces.h>
0017 #include <CLHEP/Units/GlobalPhysicalConstants.h>
0018 #include <CLHEP/Units/SystemOfUnits.h>
0019
0020 #include <cmath>
0021 #include <algorithm>
0022 #include <map>
0023 #include <string>
0024 #include <vector>
0025
0026 class DDPixFwdRotation : public DDAlgorithm {
0027 public:
0028 DDPixFwdRotation() {}
0029 ~DDPixFwdRotation() override = default;
0030
0031 void initialize(const DDNumericArguments& nArgs,
0032 const DDVectorArguments& vArgs,
0033 const DDMapArguments& mArgs,
0034 const DDStringArguments& sArgs,
0035 const DDStringVectorArguments& vsArgs) override;
0036
0037 void execute(DDCompactView& cpv) override;
0038
0039 private:
0040 double endcap_;
0041 std::string rotNameNippleToCover_;
0042 std::string rotNameCoverToNipple_;
0043 std::string rotNameNippleToBody_;
0044 int nBlades_;
0045 double bladeAngle_;
0046 double bladeZShift_;
0047 double ancorRadius_;
0048 double jX_, jY_, jZ_;
0049 double kX_, kY_, kZ_;
0050 std::string rotNS_;
0051 std::string idNameSpace_;
0052 };
0053
0054 void DDPixFwdRotation::initialize(const DDNumericArguments& nArgs,
0055 const DDVectorArguments& vArgs,
0056 const DDMapArguments&,
0057 const DDStringArguments& sArgs,
0058 const DDStringVectorArguments&) {
0059
0060 endcap_ = nArgs["Endcap"];
0061 rotNameNippleToCover_ = sArgs["NippleToCover"];
0062 rotNameCoverToNipple_ = sArgs["CoverToNipple"];
0063 rotNameNippleToBody_ = sArgs["NippleToBody"];
0064 nBlades_ = static_cast<int>(nArgs["Blades"]);
0065 bladeAngle_ = nArgs["BladeAngle"];
0066 bladeZShift_ = nArgs["BladeZShift"];
0067 ancorRadius_ = nArgs["AncorRadius"];
0068
0069 jX_ = nArgs["JX"];
0070 jY_ = nArgs["JY"];
0071 jZ_ = nArgs["JZ"];
0072 kX_ = nArgs["KX"];
0073 kY_ = nArgs["KY"];
0074 kZ_ = nArgs["KZ"];
0075
0076 rotNS_ = sArgs["RotationNS"];
0077 idNameSpace_ = DDCurrentNamespace::ns();
0078
0079 edm::LogVerbatim("PixelGeom") << "DDPixFwdRotation: Initialize with endcap " << endcap_ << " NameSpace "
0080 << idNameSpace_ << ":" << rotNS_ << "\n nBlades " << nBlades_ << " bladeAngle "
0081 << bladeAngle_ << " bladeZShift " << bladeZShift_ << " ancorRadius " << ancorRadius_
0082 << " jX|jY|jZ " << jX_ << ":" << jY_ << ":" << jZ_ << " kX|kY|kZ " << kX_ << ":" << kY_
0083 << ":" << kZ_;
0084 }
0085
0086 void DDPixFwdRotation::execute(DDCompactView&) {
0087
0088 double effBladeAngle = endcap_ * bladeAngle_;
0089
0090 CLHEP::Hep3Vector jC = CLHEP::Hep3Vector(jX_ * endcap_, jY_ + ancorRadius_, jZ_);
0091 ;
0092 CLHEP::Hep3Vector kB = CLHEP::Hep3Vector(kX_ * endcap_, kY_ + ancorRadius_, kZ_);
0093 ;
0094
0095
0096 CLHEP::Hep3Vector tCB(bladeZShift_ * sin(effBladeAngle), 0., bladeZShift_ * cos(effBladeAngle));
0097
0098
0099 double deltaPhi = endcap_ * (360. / nBlades_) * CLHEP::deg;
0100 CLHEP::HepRotation rCB(CLHEP::Hep3Vector(1. * sin(effBladeAngle), 0., 1. * cos(effBladeAngle)), deltaPhi);
0101
0102
0103 CLHEP::Hep3Vector kC = rCB * (kB + tCB);
0104
0105
0106 CLHEP::Hep3Vector jkC = kC - jC;
0107 double jkLength = jkC.mag();
0108 DDConstant JK(DDName("JK", rotNS_), std::make_unique<double>(jkLength));
0109 edm::LogVerbatim("PixelGeom") << "+++++++++++++++ DDPixFwdRotation: JK Length " << jkLength * CLHEP::mm;
0110
0111
0112 CLHEP::Hep3Vector nippleTranslation((kC + jC) / 2. - CLHEP::Hep3Vector(0., ancorRadius_, 0.));
0113 edm::LogVerbatim("PixelGeom") << "Child translation : " << nippleTranslation;
0114
0115
0116 CLHEP::Hep3Vector vZ(0., 0., 1.);
0117 CLHEP::Hep3Vector axis = vZ.cross(jkC);
0118 double angleCover = vZ.angle(jkC);
0119 edm::LogVerbatim("PixelGeom") << " Angle to Cover: " << angleCover;
0120 CLHEP::HepRotation rpCN(axis, angleCover);
0121
0122 DDrot(DDName(rotNameCoverToNipple_, rotNS_),
0123 std::make_unique<DDRotationMatrix>(
0124 rpCN.xx(), rpCN.xy(), rpCN.xz(), rpCN.yx(), rpCN.yy(), rpCN.yz(), rpCN.zx(), rpCN.zy(), rpCN.zz()));
0125 CLHEP::HepRotation rpNC(axis, -angleCover);
0126 edm::LogVerbatim("PixelGeom") << "DDPixFwdBlades::Defines " << DDName(rotNameCoverToNipple_, rotNS_) << " with "
0127 << rpCN;
0128
0129 DDrot(DDName(rotNameNippleToCover_, rotNS_),
0130 std::make_unique<DDRotationMatrix>(
0131 rpNC.xx(), rpNC.xy(), rpNC.xz(), rpNC.yx(), rpNC.yy(), rpNC.yz(), rpNC.zx(), rpNC.zy(), rpNC.zz()));
0132 edm::LogVerbatim("PixelGeom") << "DDPixFwdBlades::Defines " << DDName(rotNameNippleToCover_, rotNS_) << " with "
0133 << rpNC;
0134
0135
0136 CLHEP::HepRotation rpNB(rpNC * rCB);
0137 DDrot(DDName(rotNameNippleToBody_, rotNS_),
0138 std::make_unique<DDRotationMatrix>(
0139 rpNB.xx(), rpNB.xy(), rpNB.xz(), rpNB.yx(), rpNB.yy(), rpNB.yz(), rpNB.zx(), rpNB.zy(), rpNB.zz()));
0140 edm::LogVerbatim("PixelGeom") << "DDPixFwdBlades::Defines " << DDName(rotNameNippleToBody_, rotNS_) << " with "
0141 << rpNB;
0142 edm::LogVerbatim("PixelGeom") << " Angle to body : " << vZ.angle(rpNB * vZ);
0143 }
0144
0145 DEFINE_EDM_PLUGIN(DDAlgorithmFactory, DDPixFwdRotation, "track:DDPixFwdRotation");