Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-05-10 02:20:49

0001 ///////////////////////////////////////////////////////////////////////////////
0002 // File: DDTBH4Algo.cc
0003 // Description: Position inside the mother according to (eta,phi)
0004 ///////////////////////////////////////////////////////////////////////////////
0005 
0006 #include <cmath>
0007 #include <algorithm>
0008 
0009 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0010 #include "DetectorDescription/Core/interface/DDLogicalPart.h"
0011 #include "DetectorDescription/Core/interface/DDSolid.h"
0012 #include "DetectorDescription/Core/interface/DDCurrentNamespace.h"
0013 #include "DetectorDescription/Core/interface/DDSplit.h"
0014 #include "Geometry/EcalTestBeam/plugins/DDTBH4Algo.h"
0015 #include <CLHEP/Units/SystemOfUnits.h>
0016 
0017 using CLHEP::deg;
0018 
0019 DDTBH4Algo::DDTBH4Algo()
0020     : m_idNameSpace(""),
0021       m_BLZBeg(0),
0022       m_BLZEnd(0),
0023       m_BLZPiv(0),
0024       m_BLRadius(0),
0025       m_VacName(""),
0026       m_VacMat(""),
0027       m_vecVacZBeg(),
0028       m_vecVacZEnd(),
0029       m_WinName(""),
0030       m_vecWinMat(),
0031       m_vecWinZBeg(),
0032       m_vecWinThick(),
0033       m_TrgMat(""),
0034       m_HoleMat(""),
0035       m_TrgVetoHoleRadius(0),
0036       m_vecTrgName(),
0037       m_vecTrgSide(),
0038       m_vecTrgThick(),
0039       m_vecTrgPhi(),
0040       m_vecTrgXOff(),
0041       m_vecTrgYOff(),
0042       m_vecTrgZPiv(),
0043       m_FibFibName(""),
0044       m_FibCladName(""),
0045       m_FibFibMat(""),
0046       m_FibCladMat(""),
0047       m_FibSide(0),
0048       m_FibCladThick(0),
0049       m_FibLength(0),
0050       m_vecFibPhi(),
0051       m_vecFibXOff(),
0052       m_vecFibYOff(),
0053       m_vecFibZPiv()
0054 
0055 {
0056   edm::LogVerbatim("EcalGeom") << "creating an instance if DDTBH4Algo";
0057   LogDebug("EcalGeom") << "DDTBH4Algo test: Creating an instance";
0058 }
0059 
0060 DDTBH4Algo::~DDTBH4Algo() {}
0061 
0062 DDRotation DDTBH4Algo::myrot(const std::string& s, const CLHEP::HepRotation& r) const {
0063   return DDrot(
0064       ddname(idNameSpace() + ":" + s),
0065       std::make_unique<DDRotationMatrix>(r.xx(), r.xy(), r.xz(), r.yx(), r.yy(), r.yz(), r.zx(), r.zy(), r.zz()));
0066 }
0067 
0068 DDMaterial DDTBH4Algo::ddmat(const std::string& s) const { return DDMaterial(ddname(s)); }
0069 
0070 DDName DDTBH4Algo::ddname(const std::string& s) const {
0071   const std::pair<std::string, std::string> temp(DDSplit(s));
0072   return DDName(temp.first, temp.second);
0073 }
0074 
0075 void DDTBH4Algo::initialize(const DDNumericArguments& nArgs,
0076                             const DDVectorArguments& vArgs,
0077                             const DDMapArguments& mArgs,
0078                             const DDStringArguments& sArgs,
0079                             const DDStringVectorArguments& vsArgs) {
0080   m_idNameSpace = DDCurrentNamespace::ns();
0081   m_BLZBeg = nArgs["BLZBeg"];
0082   m_BLZEnd = nArgs["BLZEnd"];
0083   m_BLZPiv = nArgs["BLZPiv"];
0084   m_BLRadius = nArgs["BLRadius"];
0085   m_VacName = sArgs["VacName"];
0086   m_VacMat = sArgs["VacMat"];
0087   m_vecVacZBeg = vArgs["VacZBeg"];
0088   m_vecVacZEnd = vArgs["VacZEnd"];
0089 
0090   m_WinName = sArgs["WinName"];
0091   m_vecWinMat = vsArgs["WinMat"];
0092   m_vecWinZBeg = vArgs["WinZBeg"];
0093   m_vecWinThick = vArgs["WinThick"];
0094 
0095   m_TrgMat = sArgs["TrgMat"];
0096   m_HoleMat = sArgs["HoleMat"];
0097   m_TrgVetoHoleRadius = nArgs["TrgVetoHoleRadius"];
0098   m_vecTrgName = vsArgs["TrgName"];
0099   m_vecTrgSide = vArgs["TrgSide"];
0100   m_vecTrgThick = vArgs["TrgThick"];
0101   m_vecTrgPhi = vArgs["TrgPhi"];
0102   m_vecTrgXOff = vArgs["TrgXOff"];
0103   m_vecTrgYOff = vArgs["TrgYOff"];
0104   m_vecTrgZPiv = vArgs["TrgZPiv"];
0105 
0106   m_FibFibName = sArgs["FibFibName"];
0107   m_FibCladName = sArgs["FibCladName"];
0108   m_FibFibMat = sArgs["FibFibMat"];
0109   m_FibCladMat = sArgs["FibCladMat"];
0110   m_FibSide = nArgs["FibSide"];
0111   m_FibCladThick = nArgs["FibCladThick"];
0112   m_FibLength = nArgs["FibLength"];
0113   m_vecFibPhi = vArgs["FibPhi"];
0114   m_vecFibXOff = vArgs["FibXOff"];
0115   m_vecFibYOff = vArgs["FibYOff"];
0116   m_vecFibZPiv = vArgs["FibZPiv"];
0117 }
0118 
0119 void DDTBH4Algo::execute(DDCompactView& cpv) {
0120   const unsigned int copyOne(1);
0121 
0122   const double halfZbl((blZEnd() - blZBeg()) / 2.);
0123   for (unsigned int i(0); i != vecVacZBeg().size(); ++i) {
0124     DDName vacNameNm(ddname(vacName() + std::to_string(i + 1)));
0125     const double halfZvac((vecVacZEnd()[i] - vecVacZBeg()[i]) / 2.);
0126     DDSolid vTubeSolid(DDSolidFactory::tubs(vacNameNm, halfZvac, 0, blRadius(), 0 * deg, 360 * deg));
0127     const DDLogicalPart vacLog(vacNameNm, vacMat(), vTubeSolid);
0128 
0129     cpv.position(vacLog,
0130                  parent().name(),
0131                  1 + i,
0132                  DDTranslation(0, 0, -halfZbl + halfZvac + vecVacZBeg()[i] - blZBeg()),
0133                  DDRotation());
0134   }
0135 
0136   for (unsigned int i(0); i != vecWinZBeg().size(); ++i) {
0137     DDName wName(ddname(winName() + std::to_string(i + 1)));
0138     DDSolid wTubeSolid(DDSolidFactory::tubs(wName, vecWinThick()[i] / 2., 0, blRadius(), 0 * deg, 360 * deg));
0139     const DDLogicalPart wLog(wName, ddmat(vecWinMat()[i]), wTubeSolid);
0140 
0141     const double off(0 < vecWinZBeg()[i] ? vecWinZBeg()[i] : fabs(vecWinZBeg()[i]) - vecWinThick()[i]);
0142 
0143     cpv.position(wLog,
0144                  parent().name(),
0145                  1 + i,
0146                  DDTranslation(0, 0, -halfZbl + vecWinThick()[i] / 2. + off - blZBeg()),
0147                  DDRotation());
0148   }
0149 
0150   for (unsigned int i(0); i != vecTrgName().size(); ++i) {
0151     DDName tName(ddname(vecTrgName()[i]));
0152     DDSolid tSolid(DDSolidFactory::box(tName, vecTrgSide()[i] / 2., vecTrgSide()[i] / 2., vecTrgThick()[i] / 2.));
0153     const DDLogicalPart tLog(tName, trgMat(), tSolid);
0154 
0155     if (tName.name() == "VETO") {
0156       DDName vName(ddname(tName.name() + "Hole"));
0157       DDSolid vTubeSolid(
0158           DDSolidFactory::tubs(vName, vecTrgThick()[i] / 2., 0, trgVetoHoleRadius(), 0 * deg, 360 * deg));
0159       const DDLogicalPart vLog(vName, holeMat(), vTubeSolid);
0160 
0161       cpv.position(vLog, tName, copyOne, DDTranslation(0, 0, 0), DDRotation());
0162     }
0163 
0164     cpv.position(tLog,
0165                  parent().name(),
0166                  copyOne,
0167                  DDTranslation(vecTrgXOff()[i], vecTrgYOff()[i], vecTrgZPiv()[i] - halfZbl + blZPiv() - blZBeg()),
0168                  myrot(tName.name() + "Rot", CLHEP::HepRotationZ(vecTrgPhi()[i])));
0169   }
0170 
0171   DDName pName(fibCladName());
0172   const double planeWidth(32.5 * fibSide() + 33.5 * fibCladThick());
0173   const double planeThick(2 * fibSide() + 3 * fibCladThick());
0174   DDSolid pSolid(DDSolidFactory::box(pName, planeWidth / 2., fibLength() / 2., planeThick / 2.));
0175   const DDLogicalPart pLog(pName, fibCladMat(), pSolid);
0176 
0177   DDSolid fSolid(DDSolidFactory::box(fibFibName(), fibSide() / 2., fibLength() / 2., fibSide() / 2.));
0178 
0179   const DDLogicalPart fLog(fibFibName(), fibFibMat(), fSolid);
0180 
0181   for (unsigned int j(0); j != 32; ++j) {
0182     const double xoff(planeWidth / 2. - (1 + j) * fibCladThick() - (1 + j) * fibSide());
0183     const double zoff(-planeThick / 2 + fibCladThick() + fibSide() / 2.);
0184     cpv.position(fLog, pName, 1 + j, DDTranslation(xoff, 0, zoff), DDRotation());
0185 
0186     cpv.position(fLog, pName, 33 + j, DDTranslation(xoff + (fibCladThick() + fibSide()) / 2., 0, -zoff), DDRotation());
0187   }
0188   for (unsigned int i(0); i != vecFibZPiv().size(); ++i) {
0189     cpv.position(
0190         pLog,
0191         parent().name(),
0192         1 + i,
0193         DDTranslation(
0194             vecFibXOff()[i] - 0.5 * fibSide(), vecFibYOff()[i], vecFibZPiv()[i] - halfZbl + blZPiv() - blZBeg()),
0195         myrot(pName.name() + "Rot" + std::to_string(i), CLHEP::HepRotationZ(vecFibPhi()[i])));
0196   }
0197 }