File indexing completed on 2025-03-08 03:04:15
0001
0002
0003 #include "DetectorDescription/Core/interface/DDFilteredView.h"
0004 #include "DetectorDescription/DDCMS/interface/DDFilteredView.h"
0005 #include "Geometry/MTDNumberingBuilder/plugins/CmsMTDConstruction.h"
0006 #include "Geometry/MTDNumberingBuilder/plugins/ExtractStringFromDD.h"
0007
0008 #include "DataFormats/ForwardDetId/interface/BTLDetId.h"
0009 #include "DataFormats/ForwardDetId/interface/ETLDetId.h"
0010 #include "Geometry/MTDCommonData/interface/MTDBaseNumber.h"
0011
0012 using angle_units::operators::convertRadToDeg;
0013
0014 template <class FilteredView>
0015 CmsMTDConstruction<FilteredView>::CmsMTDConstruction() : btlScheme_(), etlScheme_(), baseNumber_() {}
0016
0017 template <class FilteredView>
0018 bool CmsMTDConstruction<FilteredView>::mtdOrderZ(const GeometricTimingDet* a, const GeometricTimingDet* b) {
0019 bool order = (a->translation().z() == b->translation().z()) ? a->translation().rho() < b->translation().rho()
0020 : a->translation().z() < b->translation().z();
0021 return order;
0022 }
0023
0024 template <class FilteredView>
0025 bool CmsMTDConstruction<FilteredView>::mtdOrderRR(const GeometricTimingDet* a, const GeometricTimingDet* b) {
0026 MTDDetId id1(a->geographicalId());
0027 MTDDetId id2(b->geographicalId());
0028 return id1.mtdRR() < id2.mtdRR();
0029 }
0030
0031 template <class FilteredView>
0032 bool CmsMTDConstruction<FilteredView>::mtdOrderPhi(const GeometricTimingDet* a, const GeometricTimingDet* b) {
0033 MTDDetId id1(a->geographicalId());
0034 MTDDetId id2(b->geographicalId());
0035 return (id1.mtdRR() == id2.mtdRR()) && (angle0to2pi::make0To2pi(a->phi()) < angle0to2pi::make0To2pi(b->phi()));
0036 }
0037
0038 template <class FilteredView>
0039 bool CmsMTDConstruction<FilteredView>::btlOrderPhi(const GeometricTimingDet* a, const GeometricTimingDet* b) {
0040 return static_cast<int>(convertRadToDeg(makempiToppi(a->phi()))) <
0041 static_cast<int>(convertRadToDeg(makempiToppi(b->phi())));
0042 }
0043
0044 template <class FilteredView>
0045 bool CmsMTDConstruction<FilteredView>::btlOrderZ(const GeometricTimingDet* a, const GeometricTimingDet* b) {
0046 bool order = (static_cast<int>(convertRadToDeg(makempiToppi(a->phi()))) ==
0047 static_cast<int>(convertRadToDeg(makempiToppi(b->phi())))) &&
0048 (a->translation().z() < b->translation().z());
0049 return order;
0050 }
0051
0052 template <>
0053 void CmsMTDConstruction<DDFilteredView>::buildBTLModule(DDFilteredView& fv, GeometricTimingDet* mother) {
0054 std::string nodeName(fv.name());
0055 GeometricTimingDet* det =
0056 new GeometricTimingDet(&fv, theCmsMTDStringToEnum.type(nodeName.substr(0, CmsMTDStringToEnum::kModStrLen)));
0057
0058 auto& gh = fv.geoHistory();
0059
0060 baseNumber_.reset();
0061 baseNumber_.setSize(gh.size());
0062
0063 for (uint i = gh.size(); i-- > 0;) {
0064 baseNumber_.addLevel(gh[i].logicalPart().name().name(), gh[i].copyno());
0065 #ifdef EDM_ML_DEBUG
0066 edm::LogVerbatim("CmsMTDConstruction") << gh[i].logicalPart().name().name() << " " << gh[i].copyno();
0067 #endif
0068 }
0069
0070 det->setGeographicalID(BTLDetId(btlScheme_.getUnitID(baseNumber_)));
0071
0072 mother->addComponent(det);
0073 }
0074
0075 template <>
0076 void CmsMTDConstruction<cms::DDFilteredView>::buildBTLModule(cms::DDFilteredView& fv, GeometricTimingDet* mother) {
0077 std::string nodeName(fv.name());
0078 GeometricTimingDet* det =
0079 new GeometricTimingDet(&fv, theCmsMTDStringToEnum.type(nodeName.substr(0, CmsMTDStringToEnum::kModStrLen)));
0080
0081 baseNumber_.reset();
0082 baseNumber_.setSize(fv.copyNos().size());
0083
0084 for (uint i = 0; i < fv.copyNos().size(); i++) {
0085 std::string_view name((fv.geoHistory()[i])->GetName());
0086 size_t ipos = name.rfind('_');
0087 baseNumber_.addLevel(name.substr(0, ipos), fv.copyNos()[i]);
0088 #ifdef EDM_ML_DEBUG
0089 edm::LogVerbatim("CmsMTDConstruction") << name.substr(0, ipos) << " " << fv.copyNos()[i];
0090 #endif
0091 }
0092
0093 det->setGeographicalID(BTLDetId(btlScheme_.getUnitID(baseNumber_)));
0094
0095 mother->addComponent(det);
0096 }
0097
0098 template <>
0099 void CmsMTDConstruction<DDFilteredView>::buildETLModule(DDFilteredView& fv, GeometricTimingDet* mother) {
0100 std::string nodeName(fv.name());
0101 GeometricTimingDet* det =
0102 new GeometricTimingDet(&fv, theCmsMTDStringToEnum.type(nodeName.substr(0, CmsMTDStringToEnum::kModStrLen)));
0103
0104 auto& gh = fv.geoHistory();
0105
0106 baseNumber_.reset();
0107 baseNumber_.setSize(gh.size());
0108
0109 for (uint i = gh.size(); i-- > 0;) {
0110 baseNumber_.addLevel(gh[i].logicalPart().name().name(), gh[i].copyno());
0111 #ifdef EDM_ML_DEBUG
0112 edm::LogVerbatim("CmsMTDConstruction") << gh[i].logicalPart().name().name() << " " << gh[i].copyno();
0113 #endif
0114 }
0115
0116 det->setGeographicalID(ETLDetId(etlScheme_.getUnitID(baseNumber_)));
0117
0118 mother->addComponent(det);
0119 }
0120
0121 template <>
0122 void CmsMTDConstruction<cms::DDFilteredView>::buildETLModule(cms::DDFilteredView& fv, GeometricTimingDet* mother) {
0123 std::string nodeName(fv.name());
0124 GeometricTimingDet* det =
0125 new GeometricTimingDet(&fv, theCmsMTDStringToEnum.type(nodeName.substr(0, CmsMTDStringToEnum::kModStrLen)));
0126
0127 baseNumber_.reset();
0128 baseNumber_.setSize(fv.copyNos().size());
0129
0130 for (uint i = 0; i < fv.copyNos().size(); i++) {
0131 std::string_view name((fv.geoHistory()[i])->GetName());
0132 size_t ipos = name.rfind('_');
0133 baseNumber_.addLevel(name.substr(0, ipos), fv.copyNos()[i]);
0134 #ifdef EDM_ML_DEBUG
0135 edm::LogVerbatim("CmsMTDConstruction") << name.substr(0, ipos) << " " << fv.copyNos()[i];
0136 #endif
0137 }
0138
0139 det->setGeographicalID(ETLDetId(etlScheme_.getUnitID(baseNumber_)));
0140
0141 mother->addComponent(det);
0142 }
0143
0144 template <class FilteredView>
0145 GeometricTimingDet* CmsMTDConstruction<FilteredView>::buildSubdet(FilteredView& fv) {
0146 std::string nodeName(fv.name());
0147 auto thisDet = theCmsMTDStringToEnum.type(nodeName);
0148 GeometricTimingDet* subdet = new GeometricTimingDet(&fv, thisDet);
0149
0150 if (thisDet == GeometricTimingDet::BTL) {
0151 subdet->setGeographicalID(BTLDetId(0, 0, 0, 0, 0, 0));
0152 } else if (thisDet == GeometricTimingDet::ETL) {
0153 const uint32_t side = subdet->translation().z() > 0 ? 1 : 0;
0154 subdet->setGeographicalID(ETLDetId(side, 0, 0, 0, 0));
0155 } else {
0156 throw cms::Exception("CmsMTDConstruction") << " ERROR - I was expecting a SubDet, I got a " << fv.name();
0157 }
0158
0159 return subdet;
0160 }
0161
0162 template <class FilteredView>
0163 GeometricTimingDet* CmsMTDConstruction<FilteredView>::buildLayer(FilteredView& fv) {
0164 std::string nodeName(fv.name());
0165 auto thisDet = theCmsMTDStringToEnum.type(nodeName);
0166 GeometricTimingDet* layer = new GeometricTimingDet(&fv, thisDet);
0167
0168 if (thisDet != GeometricTimingDet::BTLLayer && thisDet != GeometricTimingDet::ETLDisc) {
0169 throw cms::Exception("CmsMTDConstruction") << " ERROR - I was expecting a SubDet, I got a " << fv.name();
0170 }
0171
0172 uint32_t nLayer;
0173 if (thisDet == GeometricTimingDet::BTLLayer) {
0174
0175
0176
0177 nLayer = 1;
0178 layer->setGeographicalID(nLayer);
0179 } else if (thisDet == GeometricTimingDet::ETLDisc) {
0180
0181
0182
0183 nLayer = (fv.name().find("Disc1") != std::string::npos) ? 1 : 2;
0184 layer->setGeographicalID(nLayer);
0185 }
0186
0187 return layer;
0188 }
0189
0190 template <class FilteredView>
0191 bool CmsMTDConstruction<FilteredView>::isETLpreV8(FilteredView& fv) {
0192 return (fv.name().find("EModule") != std::string::npos);
0193 }
0194
0195 template class CmsMTDConstruction<DDFilteredView>;
0196 template class CmsMTDConstruction<cms::DDFilteredView>;