File indexing completed on 2024-04-06 12:05:32
0001 #include "DetectorDescription/Parser/src/DDDividedTrd.h"
0002 #include "DetectorDescription/Core/interface/DDAxes.h"
0003 #include "DetectorDescription/Core/interface/DDLogicalPart.h"
0004 #include "DetectorDescription/Core/interface/DDMaterial.h"
0005 #include "DetectorDescription/Core/interface/DDName.h"
0006 #include "DetectorDescription/Core/interface/DDSolid.h"
0007 #include "DetectorDescription/Core/interface/DDTransform.h"
0008 #include "DataFormats/Math/interface/GeantUnits.h"
0009 #include "DetectorDescription/Parser/src/DDDividedGeometryObject.h"
0010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0011 #include "FWCore/Utilities/interface/Exception.h"
0012
0013 #include <cmath>
0014 #include <ostream>
0015 #include <string>
0016 #include <utility>
0017
0018 class DDCompactView;
0019
0020 using namespace geant_units::operators;
0021
0022 DDDividedTrdX::DDDividedTrdX(const DDDivision& div, DDCompactView* cpv) : DDDividedGeometryObject(div, cpv) {
0023 checkParametersValidity();
0024 setType("DivisionTrdX");
0025 DDTrap mtrd = (DDTrap)(div_.parent().solid());
0026
0027 if (divisionType_ == DivWIDTH) {
0028 compNDiv_ = calculateNDiv(2 * mtrd.x1(), div_.width(), div_.offset());
0029 } else if (divisionType_ == DivNDIV) {
0030 compWidth_ = calculateWidth(2 * mtrd.x1(), div_.nReplicas(), div_.offset());
0031 }
0032 }
0033
0034 double DDDividedTrdX::getMaxParameter(void) const {
0035 DDTrap mtrd = (DDTrap)(div_.parent().solid());
0036 return 2 * mtrd.x1();
0037 }
0038
0039 DDTranslation DDDividedTrdX::makeDDTranslation(const int copyNo) const {
0040 DDTrap mtrd = (DDTrap)(div_.parent().solid());
0041 double mdx = mtrd.x1();
0042
0043
0044 double posi = -mdx + div_.offset() + (copyNo + 0.5) * compWidth_;
0045
0046 if (div_.axis() == DDAxes::x) {
0047 return DDTranslation(posi, 0.0, 0.0);
0048 } else {
0049 std::string s = "ERROR - DDDividedTrdX::makeDDTranslation()";
0050 s += "\n Axis is along ";
0051 s += DDAxesNames::name(div_.axis());
0052 s += " !\n";
0053 s += "DDDividedTrdX::makeDDTranslation()";
0054 s += " IllegalConstruct: Only axes along x are allowed !";
0055 throw cms::Exception("DDException") << s;
0056 }
0057
0058 return DDTranslation();
0059 }
0060
0061 DDRotation DDDividedTrdX::makeDDRotation(const int copyNo) const { return DDRotation(); }
0062
0063 DDLogicalPart DDDividedTrdX::makeDDLogicalPart(const int copyNo) const {
0064 DDTrap mtrd = (DDTrap)(div_.parent().solid());
0065 DDMaterial usemat = div_.parent().material();
0066
0067 double pDy1 = mtrd.y1();
0068 double pDy2 = mtrd.y2();
0069 double pDz = mtrd.halfZ();
0070 double pDx = compWidth_ / 2.;
0071
0072 DDName solname(div_.parent().ddname().name() + "_DIVCHILD", div_.parent().ddname().ns());
0073 DDSolid dsol(solname);
0074 DDLogicalPart ddlp(solname);
0075 if (!dsol.isDefined().second) {
0076 dsol = DDSolidFactory::trap(solname, pDz, 0._deg, 0._deg, pDy1, pDx, pDx, 0._deg, pDy2, pDx, pDx, 0._deg);
0077 ddlp = DDLogicalPart(solname, usemat, dsol);
0078 }
0079 return ddlp;
0080 }
0081
0082 void DDDividedTrdX::checkParametersValidity(void) {
0083 DDDividedGeometryObject::checkParametersValidity();
0084
0085 DDTrap mtrd = (DDTrap)(div_.parent().solid());
0086
0087 double mpDx1 = mtrd.x1();
0088 double mpDx2 = mtrd.x2();
0089 double mpDx3 = mtrd.x3();
0090 double mpDx4 = mtrd.x4();
0091 double mpTheta = mtrd.theta();
0092 double mpPhi = mtrd.phi();
0093 double mpAlpha1 = mtrd.alpha1();
0094 double mpAlpha2 = mtrd.alpha2();
0095
0096 if (fabs(mpDx1 - mpDx2) > tolerance() || fabs(mpDx3 - mpDx4) > tolerance() || fabs(mpDx1 - mpDx4) > tolerance()) {
0097 std::string s = "ERROR - DDDividedTrdX::checkParametersValidity()";
0098 s += "\n Making a division of a TRD along axis X,";
0099 s += "\n while the X half lengths are not equal,";
0100 s += "\n is not (yet) supported. It will result";
0101 s += "\n in non-equal division solids.";
0102 throw cms::Exception("DDException") << s;
0103 }
0104
0105
0106
0107 if (mpAlpha1 != 0._deg || mpAlpha2 != 0._deg || mpTheta != 0._deg || mpPhi != 0._deg) {
0108 std::string s = "ERROR - DDDividedTrdX::checkParametersValidity()";
0109 s += "\n Making a division of a TRD along axis X,";
0110 s += "\n while the theta, phi and aplhpa2 are not zero,";
0111 s += "\n is not (yet) supported. It will result";
0112 s += "\n in non-equal division solids.";
0113 throw cms::Exception("DDException") << s;
0114 }
0115 }
0116
0117 DDDividedTrdY::DDDividedTrdY(const DDDivision& div, DDCompactView* cpv) : DDDividedGeometryObject(div, cpv) {
0118 checkParametersValidity();
0119 setType("DivisionTrdY");
0120 DDTrap mtrd = (DDTrap)(div_.parent().solid());
0121
0122 if (divisionType_ == DivWIDTH) {
0123 compNDiv_ = calculateNDiv(2 * mtrd.y1(), div_.width(), div_.offset());
0124 } else if (divisionType_ == DivNDIV) {
0125 compWidth_ = calculateWidth(2 * mtrd.y1(), div_.nReplicas(), div_.offset());
0126 }
0127 }
0128
0129 double DDDividedTrdY::getMaxParameter(void) const {
0130 DDTrap mtrd = (DDTrap)(div_.parent().solid());
0131 return 2 * mtrd.y1();
0132 }
0133
0134 DDTranslation DDDividedTrdY::makeDDTranslation(const int copyNo) const {
0135 DDTrap mtrd = (DDTrap)(div_.parent().solid());
0136 double mdy = mtrd.y1();
0137
0138
0139 double posi = -mdy + div_.offset() + (copyNo + 0.5) * compWidth_;
0140
0141 if (div_.axis() == DDAxes::y) {
0142 return DDTranslation(0.0, posi, 0.0);
0143 } else {
0144 std::string s = "ERROR - DDDividedTrdY::makeDDTranslation()";
0145 s += "\n Axis is along ";
0146 s += DDAxesNames::name(div_.axis());
0147 s += " !\n";
0148 s += "DDDividedTrdY::makeDDTranslation()";
0149 s += " IllegalConstruct: Only axes along y are allowed !";
0150 throw cms::Exception("DDException") << s;
0151 }
0152 return DDTranslation();
0153 }
0154
0155 DDRotation DDDividedTrdY::makeDDRotation(const int copyNo) const { return DDRotation(); }
0156
0157 DDLogicalPart DDDividedTrdY::makeDDLogicalPart(const int copyNo) const {
0158
0159
0160 DDTrap mtrd = (DDTrap)(div_.parent().solid());
0161 DDMaterial usemat = div_.parent().material();
0162
0163 double pDx1 = mtrd.x1();
0164 double pDx2 = mtrd.x2();
0165 double pDx3 = mtrd.x3();
0166 double pDx4 = mtrd.x4();
0167 double pDz = mtrd.halfZ();
0168 double pDy = compWidth_ / 2.;
0169
0170 DDName solname(div_.name());
0171 DDSolid dsol(solname);
0172 DDLogicalPart ddlp(solname);
0173 if (!dsol.isDefined().second) {
0174 dsol = DDSolidFactory::trap(solname, pDz, 0._deg, 0._deg, pDy, pDx1, pDx2, 0._deg, pDy, pDx3, pDx4, 0._deg);
0175 DDLogicalPart ddlp(solname, usemat, dsol);
0176 }
0177 return ddlp;
0178 }
0179
0180 void DDDividedTrdY::checkParametersValidity(void) {
0181 DDDividedGeometryObject::checkParametersValidity();
0182
0183 DDTrap mtrd = (DDTrap)(div_.parent().solid());
0184
0185 double mpDy1 = mtrd.y1();
0186 double mpDy2 = mtrd.y2();
0187 double mpTheta = mtrd.theta();
0188 double mpPhi = mtrd.phi();
0189 double mpAlpha1 = mtrd.alpha1();
0190 double mpAlpha2 = mtrd.alpha2();
0191
0192 if (fabs(mpDy1 - mpDy2) > tolerance()) {
0193 std::string s = "ERROR - DDDividedTrdY::checkParametersValidity()";
0194 s += "\n Making a division of a TRD along axis Y while";
0195 s += "\n the Y half lengths are not equal is not (yet)";
0196 s += "\n supported. It will result in non-equal";
0197 s += "\n division solids.";
0198 throw cms::Exception("DDException") << s;
0199 }
0200
0201
0202 if (mpAlpha1 != 0._deg || mpAlpha2 != 0._deg || mpTheta != 0._deg || mpPhi != 0._deg) {
0203 std::string s = "ERROR - DDDividedTrdY::checkParametersValidity()";
0204 s += "\n Making a division of a TRD along axis X,";
0205 s += "\n while the theta, phi and aplhpa2 are not zero,";
0206 s += "\n is not (yet) supported. It will result";
0207 s += "\n in non-equal division solids.";
0208 throw cms::Exception("DDException") << s;
0209 }
0210 }
0211
0212 DDDividedTrdZ::DDDividedTrdZ(const DDDivision& div, DDCompactView* cpv) : DDDividedGeometryObject(div, cpv) {
0213 checkParametersValidity();
0214 setType("DivTrdZ");
0215 DDTrap mtrd = (DDTrap)(div_.parent().solid());
0216
0217 if (divisionType_ == DivWIDTH) {
0218 compNDiv_ = calculateNDiv(2 * mtrd.halfZ(), div_.width(), div_.offset());
0219 } else if (divisionType_ == DivNDIV) {
0220 compWidth_ = calculateWidth(2 * mtrd.halfZ(), div_.nReplicas(), div_.offset());
0221 }
0222 }
0223
0224 double DDDividedTrdZ::getMaxParameter(void) const {
0225 DDTrap mtrd = (DDTrap)(div_.parent().solid());
0226 return 2 * mtrd.halfZ();
0227 }
0228
0229 DDTranslation DDDividedTrdZ::makeDDTranslation(const int copyNo) const {
0230 DDTrap mtrd = (DDTrap)(div_.parent().solid());
0231 double mdz = mtrd.halfZ();
0232
0233
0234 double posi = -mdz + div_.offset() + (copyNo + 0.5) * compWidth_;
0235
0236 if (div_.axis() == DDAxes::z) {
0237 return DDTranslation(0.0, 0.0, posi);
0238 } else {
0239 std::string s = "ERROR - DDDividedTrdZ::makeDDTranslation()";
0240 s += "\n Axis is along ";
0241 s += DDAxesNames::name(div_.axis());
0242 s += " !\n";
0243 s += "DDDividedTrdY::makeDDTranslation()";
0244 s += " IllegalConstruct: Only axes along z are allowed !";
0245 throw cms::Exception("DDException") << s;
0246 }
0247 return DDTranslation();
0248 }
0249
0250 DDRotation DDDividedTrdZ::makeDDRotation(const int copyNo) const { return DDRotation(); }
0251
0252 DDLogicalPart DDDividedTrdZ::makeDDLogicalPart(const int copyNo) const {
0253
0254 DDTrap mtrd = (DDTrap)(div_.parent().solid());
0255 DDMaterial usemat = div_.parent().material();
0256
0257 double pDx1 = mtrd.x1();
0258 double DDx = (mtrd.x2() - mtrd.x1());
0259 double pDy1 = mtrd.y1();
0260 double DDy = (mtrd.y2() - mtrd.y1());
0261 double pDz = compWidth_ / 2.;
0262 double zLength = 2 * mtrd.halfZ();
0263
0264 DDName solname(div_.parent().ddname().name() + "_DIVCHILD" + std::to_string(copyNo), div_.parent().ddname().ns());
0265 DDSolid dsol = DDSolidFactory::trap(solname,
0266 pDz,
0267 0._deg,
0268 0._deg,
0269 pDy1 + DDy * (div_.offset() + copyNo * compWidth_) / zLength,
0270 pDx1 + DDx * (div_.offset() + copyNo * compWidth_) / zLength,
0271 pDx1 + DDx * (div_.offset() + copyNo * compWidth_) / zLength,
0272 0._deg,
0273 pDy1 + DDy * (div_.offset() + (copyNo + 1) * compWidth_) / zLength,
0274 pDx1 + DDx * (div_.offset() + (copyNo + 1) * compWidth_) / zLength,
0275 pDx1 + DDx * (div_.offset() + (copyNo + 1) * compWidth_) / zLength,
0276 0._deg);
0277
0278 DDLogicalPart ddlp(solname, usemat, dsol);
0279 return ddlp;
0280 }
0281
0282 void DDDividedTrdZ::checkParametersValidity(void) {
0283 DDDividedGeometryObject::checkParametersValidity();
0284
0285 DDTrap mtrd = (DDTrap)(div_.parent().solid());
0286
0287 double mpTheta = mtrd.theta();
0288 double mpPhi = mtrd.phi();
0289 double mpAlpha1 = mtrd.alpha1();
0290 double mpAlpha2 = mtrd.alpha2();
0291
0292
0293
0294 if (mpAlpha1 != 0._deg || mpAlpha2 != 0._deg || mpTheta != 0._deg || mpPhi != 0._deg) {
0295 std::string s = "ERROR - DDDividedTrdZ::checkParametersValidity()";
0296 s += "\n Making a division of a TRD along axis X,";
0297 s += "\n while the theta, phi and aplhpa2 are not zero,";
0298 s += "\n is not (yet) supported. It will result";
0299 s += "\n in non-equal division solids.";
0300 throw cms::Exception("DDException") << s;
0301 }
0302 }