Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-03-26 01:51:18

0001 //#define EDM_ML_DEBUG
0002 
0003 #include "Geometry/MTDGeometryBuilder/interface/MTDParametersFromDD.h"
0004 #include "Geometry/MTDCommonData/interface/MTDTopologyMode.h"
0005 #include "CondFormats/GeometryObjects/interface/PMTDParameters.h"
0006 #include "DetectorDescription/Core/interface/DDCompactView.h"
0007 #include "DetectorDescription/Core/interface/DDFilteredView.h"
0008 #include "DetectorDescription/Core/interface/DDutils.h"
0009 #include "DetectorDescription/DDCMS/interface/DDCompactView.h"
0010 #include "DetectorDescription/DDCMS/interface/DDFilteredView.h"
0011 
0012 using namespace MTDTopologyMode;
0013 
0014 namespace {
0015   int getMTDTopologyMode(const char* s, const DDsvalues_type& sv) {
0016     DDValue val(s);
0017     if (DDfetch(&sv, val)) {
0018       const std::vector<std::string>& fvec = val.strings();
0019       if (fvec.empty()) {
0020         throw cms::Exception("MTDParametersFromDD") << "Failed to get " << s << " tag.";
0021       }
0022 
0023       int result(-1);
0024       MTDTopologyMode::Mode eparser = MTDTopologyMode::MTDStringToEnumParser(fvec[0]);
0025       result = static_cast<int>(eparser);
0026       return result;
0027     } else {
0028       throw cms::Exception("MTDParametersFromDD") << "Failed to get " << s << " tag.";
0029     }
0030   }
0031 }  // namespace
0032 
0033 bool MTDParametersFromDD::build(const DDCompactView* cvp, PMTDParameters& ptp) {
0034   std::array<std::string, 2> mtdSubdet{{"BTL", "ETL"}};
0035   int subdet(0);
0036   for (const auto& name : mtdSubdet) {
0037     auto const& v = cvp->vector(name);
0038     if (!v.empty()) {
0039       subdet++;
0040       std::vector<int> subdetPars = dbl_to_int(v);
0041       putOne(subdet, subdetPars, ptp);
0042     } else {
0043       throw cms::Exception("MTDParametersFromDD") << "Not found " << name << " but needed.";
0044     }
0045   }
0046 
0047   ptp.vpars_ = dbl_to_int(cvp->vector("vPars"));
0048 
0049   std::string attribute = "OnlyForMTDRecNumbering";
0050   DDSpecificsHasNamedValueFilter filter1{attribute};
0051   DDFilteredView fv1(*cvp, filter1);
0052   bool ok = fv1.firstChild();
0053   int topoMode(-1);
0054   if (ok) {
0055     DDsvalues_type sv(fv1.mergedSpecifics());
0056     topoMode = getMTDTopologyMode("TopologyMode", sv);
0057     ptp.topologyMode_ = topoMode;
0058   } else {
0059     throw cms::Exception("MTDParametersFromDD") << "Not found " << attribute.c_str() << " but needed.";
0060   }
0061 
0062   std::vector<std::string> etlLayout;
0063   if (static_cast<int>(MTDTopologyMode::etlLayoutFromTopoMode(topoMode)) <=
0064       static_cast<int>(MTDTopologyMode::EtlLayout::v8)) {
0065     etlLayout.emplace_back("StartCopyNo_Front_Left");
0066     etlLayout.emplace_back("StartCopyNo_Front_Right");
0067     etlLayout.emplace_back("StartCopyNo_Back_Left");
0068     etlLayout.emplace_back("StartCopyNo_Back_Right");
0069     etlLayout.emplace_back("Offset_Front_Left");
0070     etlLayout.emplace_back("Offset_Front_Right");
0071     etlLayout.emplace_back("Offset_Back_Left");
0072     etlLayout.emplace_back("Offset_Back_Right");
0073   } else if (static_cast<int>(MTDTopologyMode::etlLayoutFromTopoMode(topoMode)) >
0074              static_cast<int>(MTDTopologyMode::EtlLayout::v8)) {
0075     etlLayout.emplace_back("StartCopyNo_Front_Disc_1");
0076     etlLayout.emplace_back("StartCopyNo_Back_Disc_1");
0077     etlLayout.emplace_back("StartCopyNo_Front_Disc_2");
0078     etlLayout.emplace_back("StartCopyNo_Back_Disc_2");
0079     etlLayout.emplace_back("Offset_Front_Disc_1");
0080     etlLayout.emplace_back("Offset_Back_Disc_1");
0081     etlLayout.emplace_back("Offset_Front_Disc_2");
0082     etlLayout.emplace_back("Offset_Back_Disc_2");
0083   }
0084   int sector(10);
0085   for (const auto& name : etlLayout) {
0086     auto const& v = cvp->vector(name);
0087     if (!v.empty()) {
0088       sector++;
0089       std::vector<int> ipos = dbl_to_int(v);
0090       putOne(sector, ipos, ptp);
0091     } else {
0092       throw cms::Exception("MTDParametersFromDD") << "Not found " << name << " but needed.";
0093     }
0094   }
0095 
0096   return true;
0097 }
0098 
0099 bool MTDParametersFromDD::build(const cms::DDCompactView* cvp, PMTDParameters& ptp) {
0100   cms::DDVectorsMap vmap = cvp->detector()->vectors();
0101 
0102   std::array<std::string, 2> mtdSubdet{{"BTL", "ETL"}};
0103   int subdet(0);
0104   for (const auto& name : mtdSubdet) {
0105     bool found(false);
0106     for (auto const& it : vmap) {
0107       if (dd4hep::dd::compareEqual(dd4hep::dd::noNamespace(it.first), name)) {
0108         subdet++;
0109         std::vector<int> subdetPars;
0110         subdetPars.reserve(it.second.size());
0111         for (const auto& i : it.second)
0112           subdetPars.emplace_back(std::round(i));
0113         putOne(subdet, subdetPars, ptp);
0114         found = true;
0115         break;
0116       }
0117     }
0118     if (!found) {
0119       throw cms::Exception("MTDParametersFromDD") << "Not found " << name << " but needed.";
0120     }
0121   }
0122 
0123   auto it = vmap.find("vPars");
0124   if (it != end(vmap)) {
0125     std::vector<int> tmpVec;
0126     for (const auto& i : it->second)
0127       tmpVec.emplace_back(std::round(i));
0128     ptp.vpars_ = tmpVec;
0129   }
0130 
0131   cms::DDSpecParRefs ref;
0132   const cms::DDSpecParRegistry& mypar = cvp->specpars();
0133   std::string attribute = "OnlyForMTDRecNumbering";
0134   mypar.filter(ref, attribute, "MTD");
0135 
0136   std::string topoModeS(mypar.specPar("mtdNumbering")->strValue("TopologyMode"));
0137   int topoMode(-1);
0138   if (!topoModeS.empty()) {
0139     MTDTopologyMode::Mode eparser = MTDTopologyMode::MTDStringToEnumParser(topoModeS);
0140     topoMode = static_cast<int>(eparser);
0141     ptp.topologyMode_ = topoMode;
0142   } else {
0143     throw cms::Exception("MTDParametersFromDD") << "Not found " << attribute.c_str() << " but needed.";
0144   }
0145 
0146   std::vector<std::string> etlLayout;
0147   if (static_cast<int>(MTDTopologyMode::etlLayoutFromTopoMode(topoMode)) <=
0148       static_cast<int>(MTDTopologyMode::EtlLayout::v8)) {
0149     etlLayout.emplace_back("StartCopyNo_Front_Left");
0150     etlLayout.emplace_back("StartCopyNo_Front_Right");
0151     etlLayout.emplace_back("StartCopyNo_Back_Left");
0152     etlLayout.emplace_back("StartCopyNo_Back_Right");
0153     etlLayout.emplace_back("Offset_Front_Left");
0154     etlLayout.emplace_back("Offset_Front_Right");
0155     etlLayout.emplace_back("Offset_Back_Left");
0156     etlLayout.emplace_back("Offset_Back_Right");
0157   } else if (static_cast<int>(MTDTopologyMode::etlLayoutFromTopoMode(topoMode)) >
0158              static_cast<int>(MTDTopologyMode::EtlLayout::v8)) {
0159     etlLayout.emplace_back("StartCopyNo_Front_Disc_1");
0160     etlLayout.emplace_back("StartCopyNo_Back_Disc_1");
0161     etlLayout.emplace_back("StartCopyNo_Front_Disc_2");
0162     etlLayout.emplace_back("StartCopyNo_Back_Disc_2");
0163     etlLayout.emplace_back("Offset_Front_Disc_1");
0164     etlLayout.emplace_back("Offset_Back_Disc_1");
0165     etlLayout.emplace_back("Offset_Front_Disc_2");
0166     etlLayout.emplace_back("Offset_Back_Disc_2");
0167   }
0168   int sector(10);  // add vector index with offset, to distinguish from subdet
0169   for (const auto& name : etlLayout) {
0170     bool found(false);
0171     for (auto const& it : vmap) {
0172       if (dd4hep::dd::compareEqual(dd4hep::dd::noNamespace(it.first), name)) {
0173         sector++;
0174         std::vector<int> ipos;
0175         ipos.reserve(it.second.size());
0176         for (const auto& i : it.second)
0177           ipos.emplace_back(std::round(i));
0178         putOne(sector, ipos, ptp);
0179         found = true;
0180         break;
0181       }
0182     }
0183     if (!found) {
0184       throw cms::Exception("MTDParametersFromDD") << "Not found " << name << " but needed.";
0185     }
0186   }
0187 
0188   return true;
0189 }
0190 
0191 void MTDParametersFromDD::putOne(int subdet, std::vector<int>& vpars, PMTDParameters& ptp) {
0192   PMTDParameters::Item item;
0193   item.id_ = subdet;
0194   item.vpars_ = vpars;
0195   ptp.vitems_.emplace_back(item);
0196 #ifdef EDM_ML_DEBUG
0197   auto print_item = [&]() {
0198     std::stringstream ss;
0199     ss << item.id_ << " with " << item.vpars_.size() << " elements:";
0200     for (const auto& thePar : item.vpars_) {
0201       ss << " " << thePar;
0202     }
0203     return ss.str();
0204   };
0205   edm::LogInfo("MTDParametersFromDD") << "Adding PMTDParameters item: " << print_item();
0206 #endif
0207 }