Go to the documentation of this file.00001
00002
00003
00005
00006 #include <cmath>
00007 #include <algorithm>
00008
00009 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00010 #include "DetectorDescription/Base/interface/DDutils.h"
00011 #include "DetectorDescription/Core/interface/DDCurrentNamespace.h"
00012 #include "DetectorDescription/Core/interface/DDSplit.h"
00013 #include "SLHCUpgradeSimulations/Geometry/interface/DDPixFwdDiskAlgo.h"
00014 #include "CLHEP/Units/PhysicalConstants.h"
00015 #include "CLHEP/Units/SystemOfUnits.h"
00016
00017 DDPixFwdDiskAlgo::DDPixFwdDiskAlgo() {
00018 LogDebug("TrackerGeom") <<"DDPixFwdDiskAlgo info: Creating an instance";
00019 }
00020
00021 DDPixFwdDiskAlgo::~DDPixFwdDiskAlgo() {}
00022
00023 void DDPixFwdDiskAlgo::initialize(const DDNumericArguments & nArgs,
00024 const DDVectorArguments & vArgs,
00025 const DDMapArguments & ,
00026 const DDStringArguments & sArgs,
00027 const DDStringVectorArguments & vsArgs) {
00028
00029 startCopyNo = int(nArgs["StartCopyNo"]);
00030 nBlades = int(nArgs["NumberOfBlades"]);
00031 bladeAngle = nArgs["BladeAngle"];
00032 bladeTilt = nArgs["BladeTilt"];
00033 zPlane = nArgs["BladeCommonZ"];
00034 bladeZShift = vArgs["BladeZShift"];
00035 anchorR = nArgs["AnchorRadius"];
00036
00037 idNameSpace = DDCurrentNamespace::ns();
00038 childName = sArgs["ChildName"];
00039 rotName = sArgs["RotationName"];
00040 flagString = sArgs["FlagString"];
00041 DDName parentName = parent().name();
00042 LogDebug("TrackerGeom") << "DDPixFwdDiskAlgo debug: Parent " << parentName
00043 << "\tChild " << childName << " NameSpace "
00044 << idNameSpace << "\tRot Name " << rotName
00045 << "\tCopyNo (Start/Total) " << startCopyNo << ", "
00046 << nBlades << "\tAngles " << bladeAngle/CLHEP::deg
00047 << ", " << bladeTilt/CLHEP::deg << "\tZshifts "
00048 << zPlane << "\tAmnchor Radius " << anchorR;
00049
00050 for (int iBlade=0; iBlade<nBlades; ++iBlade) {
00051 LogDebug("TrackerGeom") << "DDPixFwdDiskAlgo: Blade " << iBlade
00052 << " flag " << flagString[iBlade] << " zshift "
00053 << bladeZShift[iBlade];
00054 }
00055 }
00056
00057 void DDPixFwdDiskAlgo::execute(DDCompactView& cpv) {
00058
00059 int copy = startCopyNo;
00060 DDName mother = parent().name();
00061 DDName child(DDSplit(childName).first, DDSplit(childName).second);
00062 std::string flagSelector = "Y";
00063
00064 double deltaPhi = (360./nBlades)*CLHEP::deg;
00065 std::string rotns = DDSplit(rotName).second;
00066 for (int iBlade=0; iBlade<nBlades; ++iBlade) {
00067
00068 if (flagString[iBlade] == flagSelector[0]) {
00069 std::string rotstr = DDSplit(rotName).first +dbl_to_string(double(copy));
00070
00071 double phi = (iBlade+0.5)*deltaPhi;
00072
00073 double phix = std::atan2(std::sin(phi)*std::cos(bladeAngle),
00074 std::cos(phi)*std::cos(bladeAngle));
00075 double thetx= std::acos(-std::sin(bladeAngle));
00076 double phiy = std::atan2((std::cos(phi)*std::cos(bladeTilt)+std::sin(phi)
00077 *std::sin(bladeAngle)*std::sin(bladeTilt)),
00078 (-std::sin(phi)*std::cos(bladeTilt)+std::cos(phi)
00079 *std::sin(bladeAngle)*std::sin(bladeTilt)));
00080 double thety= std::acos(std::cos(bladeAngle)*std::sin(bladeTilt));
00081 double phiz = std::atan2((-std::cos(phi)*std::sin(bladeTilt)+std::sin(phi)
00082 *std::sin(bladeAngle)*std::cos(bladeTilt)),
00083 (std::sin(phi)*std::sin(bladeTilt)+std::cos(phi)
00084 *std::sin(bladeAngle)*std::cos(bladeTilt)));
00085 double thetz= std::acos(std::cos(bladeAngle)*std::cos(bladeTilt));
00086 DDRotation rot = DDRotation(DDName(rotstr, rotns));
00087 if (!rot) {
00088 LogDebug("TrackerGeom") << "DDPixFwdDiskAlgo test: Creating a new "
00089 << "rotation: " << rotstr << "\t"
00090 << thetx/CLHEP::deg << ", " << phix/CLHEP::deg
00091 << ", " << thety/CLHEP::deg << ", "
00092 << phiy/CLHEP::deg << ", " << thetz/CLHEP::deg
00093 << ", " << phiz/CLHEP::deg;
00094 LogDebug("TrackerGeom") << "Rotation Matrix (" << phi/CLHEP::deg << ", " << bladeAngle/CLHEP::deg << ", " << bladeTilt/CLHEP::deg << ") " << std::cos(phi)*std::cos(bladeAngle) << ", " << (-std::sin(phi)*std::cos(bladeTilt)+std::cos(phi)*std::sin(bladeAngle)*std::sin(bladeTilt)) << ", " << (std::sin(phi)*std::sin(bladeTilt)+std::cos(phi)*std::sin(bladeAngle)*std::cos(bladeTilt)) << ", " << std::sin(phi)*std::cos(bladeAngle) << ", " << (std::cos(phi)*std::cos(bladeTilt)+std::sin(phi)*std::sin(bladeAngle)*std::sin(bladeTilt)) << ", " << (-std::cos(phi)*std::sin(bladeTilt)+std::sin(phi)*std::sin(bladeAngle)*std::cos(bladeTilt)) << ", " << -std::sin(bladeAngle) << ", " << std::cos(bladeAngle)*std::sin(bladeTilt) << ", " << std::cos(bladeAngle)*std::cos(bladeTilt);
00095 rot = DDrot(DDName(rotstr, rotns), thetx,phix, thety,phiy, thetz,phiz);
00096 }
00097 double xpos = anchorR*(-std::sin(phi)*std::cos(bladeTilt)+std::cos(phi)
00098 *std::sin(bladeAngle)*std::sin(bladeTilt));
00099 double ypos = anchorR*(std::cos(phi)*std::cos(bladeTilt)+std::sin(phi)
00100 *std::sin(bladeAngle)*std::sin(bladeTilt));
00101 double zpos = anchorR*(std::cos(bladeAngle)*std::sin(bladeTilt))+zPlane+
00102 bladeZShift[iBlade];
00103 DDTranslation tran(xpos, ypos, zpos);
00104 cpv.position (child, mother, copy, tran, rot);
00105 LogDebug("TrackerGeom") << "DDPixFwdDiskAlgo test: " << child
00106 << " number " << copy << " positioned in "
00107 << mother << " at " << tran << " with " << rot;
00108 }
00109 copy++;
00110 }
00111 }