File indexing completed on 2024-04-06 12:15:17
0001
0002
0003
0004
0005
0006 #include <cmath>
0007 #include <algorithm>
0008 #include <map>
0009 #include <string>
0010 #include <vector>
0011
0012 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0013 #include "FWCore/PluginManager/interface/PluginFactory.h"
0014 #include "DetectorDescription/Core/interface/DDLogicalPart.h"
0015 #include "DetectorDescription/Core/interface/DDCurrentNamespace.h"
0016 #include "DataFormats/Math/interface/angle_units.h"
0017 #include "DetectorDescription/Core/interface/DDTypes.h"
0018 #include "DetectorDescription/Core/interface/DDAlgorithm.h"
0019 #include "DetectorDescription/Core/interface/DDAlgorithmFactory.h"
0020
0021 using namespace angle_units::operators;
0022
0023
0024
0025 class DDMuonAngular : public DDAlgorithm {
0026 public:
0027
0028 DDMuonAngular();
0029 ~DDMuonAngular() override;
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 startAngle;
0041 double stepAngle;
0042 double zoffset;
0043 int n;
0044 int startCopyNo;
0045 int incrCopyNo;
0046
0047 std::string rotns;
0048 std::string idNameSpace;
0049 std::string childName;
0050 };
0051
0052 DDMuonAngular::DDMuonAngular() {
0053 #ifdef EDM_ML_DEBUG
0054 edm::LogVerbatim("MuonGeom") << "DDMuonAngular: Creating an instance";
0055 #endif
0056 }
0057
0058 DDMuonAngular::~DDMuonAngular() {}
0059
0060 void DDMuonAngular::initialize(const DDNumericArguments& nArgs,
0061 const DDVectorArguments&,
0062 const DDMapArguments&,
0063 const DDStringArguments& sArgs,
0064 const DDStringVectorArguments&) {
0065 startAngle = nArgs["startAngle"];
0066 stepAngle = nArgs["stepAngle"];
0067 zoffset = nArgs["zoffset"];
0068 n = int(nArgs["n"]);
0069 startCopyNo = int(nArgs["startCopyNo"]);
0070 incrCopyNo = int(nArgs["incrCopyNo"]);
0071 #ifdef EDM_ML_DEBUG
0072 edm::LogVerbatim("MuonGeom") << "DDMuonAngular: Parameters for positioning-- " << n << " copies in steps of "
0073 << convertRadToDeg(stepAngle) << " from " << convertRadToDeg(startAngle) << " \tZoffest "
0074 << zoffset << "\tStart and inremental copy nos " << startCopyNo << ", " << incrCopyNo;
0075 #endif
0076 rotns = sArgs["RotNameSpace"];
0077 idNameSpace = DDCurrentNamespace::ns();
0078 childName = sArgs["ChildName"];
0079 #ifdef EDM_ML_DEBUG
0080 edm::LogVerbatim("MuonGeom") << "DDMuonAngular debug: Parent " << parent().name() << "\tChild " << childName
0081 << "\tNameSpace " << idNameSpace << "\tRotation Namespace " << rotns;
0082 #endif
0083 }
0084
0085 void DDMuonAngular::execute(DDCompactView& cpv) {
0086 double phi = startAngle;
0087 int copyNo = startCopyNo;
0088
0089 for (int ii = 0; ii < n; ii++) {
0090 double phitmp = phi;
0091 if (phitmp >= 2._pi)
0092 phitmp -= 2._pi;
0093 DDRotation rotation;
0094 std::string rotstr("NULL");
0095
0096 if (std::abs(phitmp) >= 1.0_deg) {
0097 rotstr = "R" + formatAsDegrees(phitmp);
0098 rotation = DDRotation(DDName(rotstr, rotns));
0099 if (!rotation) {
0100 #ifdef EDM_ML_DEBUG
0101 edm::LogVerbatim("MuonGeom") << "DDMuonAngular: Creating a new rotation " << DDName(rotstr, idNameSpace)
0102 << "\t90, " << convertRadToDeg(phitmp) << ", 90, "
0103 << convertRadToDeg(phitmp + 90._deg) << ", 0, 0";
0104 #endif
0105 rotation = DDrot(DDName(rotstr, rotns), 90._deg, phitmp, 90._deg, 90._deg + phitmp, 0., 0.);
0106 }
0107 }
0108
0109 DDTranslation tran(0, 0, zoffset);
0110
0111 DDName parentName = parent().name();
0112 cpv.position(DDName(childName, idNameSpace), parentName, copyNo, tran, rotation);
0113 #ifdef EDM_ML_DEBUG
0114 edm::LogVerbatim("MuonGeom") << "DDMuonAngular: " << DDName(childName, idNameSpace) << " number " << copyNo
0115 << " positioned in " << parentName << " at " << tran << " with " << rotstr << " "
0116 << rotation;
0117 #endif
0118 phi += stepAngle;
0119 copyNo += incrCopyNo;
0120 }
0121 }
0122
0123 DEFINE_EDM_PLUGIN(DDAlgorithmFactory, DDMuonAngular, "muon:DDMuonAngular");