File indexing completed on 2025-03-26 01:51:18
0001
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 }
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);
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 }