CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_2_SLHC4_patch1/src/SLHCUpgradeSimulations/Geometry/src/DDPixFwdDiskAlgo.cc

Go to the documentation of this file.
00001 
00002 // File: DDPixFwdDiskAlgo.cc
00003 // Description: Position n copies at given z-values
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 //      double phi  = (iBlade+0.5)*deltaPhi - 90.*CLHEP::deg;
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 }