File indexing completed on 2024-05-10 02:20:49
0001
0002
0003
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 }