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/DDCurrentNamespace.h"
0008 #include "DetectorDescription/Core/interface/DDSplit.h"
0009 #include "DetectorDescription/Core/interface/DDTypes.h"
0010 #include "DetectorDescription/Core/interface/DDAlgorithm.h"
0011 #include "DetectorDescription/Core/interface/DDAlgorithmFactory.h"
0012 #include <CLHEP/Units/PhysicalConstants.h>
0013 #include <CLHEP/Units/SystemOfUnits.h>
0014
0015 #include <cmath>
0016 #include <algorithm>
0017 #include <map>
0018 #include <string>
0019 #include <vector>
0020
0021 using namespace std;
0022
0023 class DDPixFwdDiskAlgo : public DDAlgorithm {
0024 public:
0025
0026 DDPixFwdDiskAlgo();
0027 ~DDPixFwdDiskAlgo() override;
0028
0029 void initialize(const DDNumericArguments& nArgs,
0030 const DDVectorArguments& vArgs,
0031 const DDMapArguments& mArgs,
0032 const DDStringArguments& sArgs,
0033 const DDStringVectorArguments& vsArgs) override;
0034
0035 void execute(DDCompactView& cpv) override;
0036
0037 private:
0038 string idNameSpace;
0039 string childName;
0040 string rotName;
0041 string flagString;
0042 int nBlades;
0043 int startCopyNo;
0044 double bladeAngle;
0045 double zPlane;
0046 vector<double> bladeZShift;
0047 double anchorR;
0048 double bladeTilt;
0049 };
0050
0051 DDPixFwdDiskAlgo::DDPixFwdDiskAlgo() { LogDebug("TrackerGeom") << "DDPixFwdDiskAlgo info: Creating an instance"; }
0052
0053 DDPixFwdDiskAlgo::~DDPixFwdDiskAlgo() {}
0054
0055 void DDPixFwdDiskAlgo::initialize(const DDNumericArguments& nArgs,
0056 const DDVectorArguments& vArgs,
0057 const DDMapArguments&,
0058 const DDStringArguments& sArgs,
0059 const DDStringVectorArguments& vsArgs) {
0060 startCopyNo = int(nArgs["StartCopyNo"]);
0061 nBlades = int(nArgs["NumberOfBlades"]);
0062 bladeAngle = nArgs["BladeAngle"];
0063 bladeTilt = nArgs["BladeTilt"];
0064 zPlane = nArgs["BladeCommonZ"];
0065 bladeZShift = vArgs["BladeZShift"];
0066 anchorR = nArgs["AnchorRadius"];
0067
0068 idNameSpace = DDCurrentNamespace::ns();
0069 childName = sArgs["ChildName"];
0070 rotName = sArgs["RotationName"];
0071 flagString = sArgs["FlagString"];
0072 DDName parentName = parent().name();
0073 LogDebug("TrackerGeom") << "DDPixFwdDiskAlgo debug: Parent " << parentName << "\tChild " << childName << " NameSpace "
0074 << idNameSpace << "\tRot Name " << rotName << "\tCopyNo (Start/Total) " << startCopyNo << ", "
0075 << nBlades << "\tAngles " << bladeAngle / CLHEP::deg << ", " << bladeTilt / CLHEP::deg
0076 << "\tZshifts " << zPlane << "\tAmnchor Radius " << anchorR;
0077
0078 for (int iBlade = 0; iBlade < nBlades; ++iBlade) {
0079 LogDebug("TrackerGeom") << "DDPixFwdDiskAlgo: Blade " << iBlade << " flag " << flagString[iBlade] << " zshift "
0080 << bladeZShift[iBlade];
0081 }
0082 }
0083
0084 void DDPixFwdDiskAlgo::execute(DDCompactView& cpv) {
0085 int copy = startCopyNo;
0086 DDName mother = parent().name();
0087 DDName child(DDSplit(childName).first, DDSplit(childName).second);
0088 string flagSelector = "Y";
0089
0090 double deltaPhi = (360. / nBlades) * CLHEP::deg;
0091 string rotns = DDSplit(rotName).second;
0092 for (int iBlade = 0; iBlade < nBlades; ++iBlade) {
0093 if (flagString[iBlade] == flagSelector[0]) {
0094 string rotstr = DDSplit(rotName).first + to_string(double(copy));
0095
0096 double phi = (iBlade + 0.5) * deltaPhi;
0097
0098 double phix = atan2(sin(phi) * cos(bladeAngle), cos(phi) * cos(bladeAngle));
0099 double thetx = acos(-sin(bladeAngle));
0100 double phiy = atan2((cos(phi) * cos(bladeTilt) + sin(phi) * sin(bladeAngle) * sin(bladeTilt)),
0101 (-sin(phi) * cos(bladeTilt) + cos(phi) * sin(bladeAngle) * sin(bladeTilt)));
0102 double thety = acos(cos(bladeAngle) * sin(bladeTilt));
0103 double phiz = atan2((-cos(phi) * sin(bladeTilt) + sin(phi) * sin(bladeAngle) * cos(bladeTilt)),
0104 (sin(phi) * sin(bladeTilt) + cos(phi) * sin(bladeAngle) * cos(bladeTilt)));
0105 double thetz = acos(cos(bladeAngle) * cos(bladeTilt));
0106 DDRotation rot = DDRotation(DDName(rotstr, rotns));
0107 if (!rot) {
0108 LogDebug("TrackerGeom") << "DDPixFwdDiskAlgo test: Creating a new "
0109 << "rotation: " << rotstr << "\t" << thetx / CLHEP::deg << ", " << phix / CLHEP::deg
0110 << ", " << thety / CLHEP::deg << ", " << phiy / CLHEP::deg << ", " << thetz / CLHEP::deg
0111 << ", " << phiz / CLHEP::deg;
0112 LogDebug("TrackerGeom") << "Rotation Matrix (" << phi / CLHEP::deg << ", " << bladeAngle / CLHEP::deg << ", "
0113 << bladeTilt / CLHEP::deg << ") " << cos(phi) * cos(bladeAngle) << ", "
0114 << (-sin(phi) * cos(bladeTilt) + cos(phi) * sin(bladeAngle) * sin(bladeTilt)) << ", "
0115 << (sin(phi) * sin(bladeTilt) + cos(phi) * sin(bladeAngle) * cos(bladeTilt)) << ", "
0116 << sin(phi) * cos(bladeAngle) << ", "
0117 << (cos(phi) * cos(bladeTilt) + sin(phi) * sin(bladeAngle) * sin(bladeTilt)) << ", "
0118 << (-cos(phi) * sin(bladeTilt) + sin(phi) * sin(bladeAngle) * cos(bladeTilt)) << ", "
0119 << -sin(bladeAngle) << ", " << cos(bladeAngle) * sin(bladeTilt) << ", "
0120 << cos(bladeAngle) * cos(bladeTilt);
0121 rot = DDrot(DDName(rotstr, rotns), thetx, phix, thety, phiy, thetz, phiz);
0122 }
0123 double xpos = anchorR * (-sin(phi) * cos(bladeTilt) + cos(phi) * sin(bladeAngle) * sin(bladeTilt));
0124 double ypos = anchorR * (cos(phi) * cos(bladeTilt) + sin(phi) * sin(bladeAngle) * sin(bladeTilt));
0125 double zpos = anchorR * (cos(bladeAngle) * sin(bladeTilt)) + zPlane + bladeZShift[iBlade];
0126 DDTranslation tran(xpos, ypos, zpos);
0127 cpv.position(child, mother, copy, tran, rot);
0128 LogDebug("TrackerGeom") << "DDPixFwdDiskAlgo test: " << child << " number " << copy << " positioned in " << mother
0129 << " at " << tran << " with " << rot;
0130 }
0131 copy++;
0132 }
0133 }
0134
0135 DEFINE_EDM_PLUGIN(DDAlgorithmFactory, DDPixFwdDiskAlgo, "track:DDPixFwdDiskAlgo");