File indexing completed on 2023-05-26 01:15:45
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 if (MTDTopologyMode::etlLayoutFromTopoMode(topoMode) == ETLDetId::EtlLayout::v5) {
0063 std::array<std::string, 8> etlLayout{{
0064 "StartCopyNo_Front_Left",
0065 "StartCopyNo_Front_Right",
0066 "StartCopyNo_Back_Left",
0067 "StartCopyNo_Back_Right",
0068 "Offset_Front_Left",
0069 "Offset_Front_Right",
0070 "Offset_Back_Left",
0071 "Offset_Back_Right",
0072 }};
0073 int sector(10);
0074 for (const auto& name : etlLayout) {
0075 auto const& v = cvp->vector(name);
0076 if (!v.empty()) {
0077 sector++;
0078 std::vector<int> ipos = dbl_to_int(v);
0079 putOne(sector, ipos, ptp);
0080 } else {
0081 throw cms::Exception("MTDParametersFromDD") << "Not found " << name << " but needed.";
0082 }
0083 }
0084 }
0085
0086 return true;
0087 }
0088
0089 bool MTDParametersFromDD::build(const cms::DDCompactView* cvp, PMTDParameters& ptp) {
0090 cms::DDVectorsMap vmap = cvp->detector()->vectors();
0091
0092 std::array<std::string, 2> mtdSubdet{{"BTL", "ETL"}};
0093 int subdet(0);
0094 for (const auto& name : mtdSubdet) {
0095 bool found(false);
0096 for (auto const& it : vmap) {
0097 if (dd4hep::dd::compareEqual(dd4hep::dd::noNamespace(it.first), name)) {
0098 subdet++;
0099 std::vector<int> subdetPars;
0100 subdetPars.reserve(it.second.size());
0101 for (const auto& i : it.second)
0102 subdetPars.emplace_back(std::round(i));
0103 putOne(subdet, subdetPars, ptp);
0104 found = true;
0105 break;
0106 }
0107 }
0108 if (!found) {
0109 throw cms::Exception("MTDParametersFromDD") << "Not found " << name << " but needed.";
0110 }
0111 }
0112
0113 auto it = vmap.find("vPars");
0114 if (it != end(vmap)) {
0115 std::vector<int> tmpVec;
0116 for (const auto& i : it->second)
0117 tmpVec.emplace_back(std::round(i));
0118 ptp.vpars_ = tmpVec;
0119 }
0120
0121 cms::DDSpecParRefs ref;
0122 const cms::DDSpecParRegistry& mypar = cvp->specpars();
0123 std::string attribute = "OnlyForMTDRecNumbering";
0124 mypar.filter(ref, attribute, "MTD");
0125
0126 std::string topoModeS(mypar.specPar("mtdNumbering")->strValue("TopologyMode"));
0127 int topoMode(-1);
0128 if (!topoModeS.empty()) {
0129 MTDTopologyMode::Mode eparser = MTDTopologyMode::MTDStringToEnumParser(topoModeS);
0130 topoMode = static_cast<int>(eparser);
0131 ptp.topologyMode_ = topoMode;
0132 } else {
0133 throw cms::Exception("MTDParametersFromDD") << "Not found " << attribute.c_str() << " but needed.";
0134 }
0135
0136 if (MTDTopologyMode::etlLayoutFromTopoMode(topoMode) == ETLDetId::EtlLayout::v5) {
0137 std::array<std::string, 8> etlLayout{{
0138 "StartCopyNo_Front_Left",
0139 "StartCopyNo_Front_Right",
0140 "StartCopyNo_Back_Left",
0141 "StartCopyNo_Back_Right",
0142 "Offset_Front_Left",
0143 "Offset_Front_Right",
0144 "Offset_Back_Left",
0145 "Offset_Back_Right",
0146 }};
0147 int sector(10);
0148 for (const auto& name : etlLayout) {
0149 bool found(false);
0150 for (auto const& it : vmap) {
0151 if (dd4hep::dd::compareEqual(dd4hep::dd::noNamespace(it.first), name)) {
0152 sector++;
0153 std::vector<int> ipos;
0154 ipos.reserve(it.second.size());
0155 for (const auto& i : it.second)
0156 ipos.emplace_back(std::round(i));
0157 putOne(sector, ipos, ptp);
0158 found = true;
0159 break;
0160 }
0161 }
0162 if (!found) {
0163 throw cms::Exception("MTDParametersFromDD") << "Not found " << name << " but needed.";
0164 }
0165 }
0166 }
0167
0168 return true;
0169 }
0170
0171 void MTDParametersFromDD::putOne(int subdet, std::vector<int>& vpars, PMTDParameters& ptp) {
0172 PMTDParameters::Item item;
0173 item.id_ = subdet;
0174 item.vpars_ = vpars;
0175 ptp.vitems_.emplace_back(item);
0176 #ifdef EDM_ML_DEBUG
0177 auto print_item = [&]() {
0178 std::stringstream ss;
0179 ss << item.id_ << " with " << item.vpars_.size() << " elements:";
0180 for (const auto& thePar : item.vpars_) {
0181 ss << " " << thePar;
0182 }
0183 return ss.str();
0184 };
0185 edm::LogInfo("MTDParametersFromDD") << "Adding PMTDParameters item: " << print_item();
0186 #endif
0187 }