Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-03-08 03:04:15

0001 //#define EDM_ML_DEBUG
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     // only one layer in BTL
0176     //
0177     nLayer = 1;
0178     layer->setGeographicalID(nLayer);
0179   } else if (thisDet == GeometricTimingDet::ETLDisc) {
0180     //
0181     // no change for pre TDR scenarios, otherwise identifiy layer with disc
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>;