File indexing completed on 2024-04-06 12:15:28
0001 #include "DetectorDescription/Core/interface/DDFilteredView.h"
0002 #include "DetectorDescription/DDCMS/interface/DDFilteredView.h"
0003 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0004 #include "Geometry/TrackerNumberingBuilder/interface/GeometricDet.h"
0005 #include "Geometry/TrackerNumberingBuilder/plugins/CmsTrackerLevelBuilder.h"
0006 #include "Geometry/TrackerNumberingBuilder/plugins/ExtractStringFromDDD.h"
0007
0008 #include <cmath>
0009
0010 #define DEBUG false
0011
0012 bool CmsTrackerLevelBuilderHelper::subDetByType(const GeometricDet* a, const GeometricDet* b) {
0013
0014
0015
0016 return a->type() % 100 < b->type() % 100;
0017 }
0018
0019
0020 bool CmsTrackerLevelBuilderHelper::phiSortNP(const GeometricDet* a, const GeometricDet* b) {
0021 if (std::abs(a->translation().rho() - b->translation().rho()) < 0.01 &&
0022 (std::abs(a->translation().phi() - b->translation().phi()) < 0.01 ||
0023 std::abs(a->translation().phi() - b->translation().phi()) > 6.27) &&
0024 a->translation().z() * b->translation().z() > 0.0) {
0025 return (std::abs(a->translation().z()) < std::abs(b->translation().z()));
0026 } else
0027 return false;
0028 }
0029
0030 bool CmsTrackerLevelBuilderHelper::isLessZ(const GeometricDet* a, const GeometricDet* b) {
0031
0032 if (a->translation().z() == b->translation().z()) {
0033 return a->translation().rho() < b->translation().rho();
0034 } else {
0035
0036 return a->translation().z() < b->translation().z();
0037 }
0038 }
0039
0040 bool CmsTrackerLevelBuilderHelper::isLessModZ(const GeometricDet* a, const GeometricDet* b) {
0041 return std::abs(a->translation().z()) < std::abs(b->translation().z());
0042 }
0043
0044 double CmsTrackerLevelBuilderHelper::getPhi(const GeometricDet* a) {
0045 double phi = a->phi();
0046 return (phi >= 0 ? phi : phi + 2 * M_PI);
0047 }
0048
0049 double CmsTrackerLevelBuilderHelper::getPhiModule(const GeometricDet* a) {
0050 std::vector<const GeometricDet*> const& comp = a->components().back()->components();
0051 float phi = 0.;
0052 bool sum = true;
0053
0054 for (auto i : comp) {
0055 if (std::abs(i->phi()) > M_PI / 2.) {
0056 sum = false;
0057 break;
0058 }
0059 }
0060
0061 if (sum) {
0062 for (auto i : comp) {
0063 phi += i->phi();
0064 }
0065
0066 double temp = phi / float(comp.size()) < 0. ? 2 * M_PI + phi / float(comp.size()) : phi / float(comp.size());
0067 return temp;
0068
0069 } else {
0070 for (auto i : comp) {
0071 double phi1 = i->phi() >= 0 ? i->phi() : i->phi() + 2 * M_PI;
0072 phi += phi1;
0073 }
0074
0075 double com = comp.front()->phi() >= 0 ? comp.front()->phi() : 2 * M_PI + comp.front()->phi();
0076 double temp =
0077 std::abs(phi / float(comp.size()) - com) > 2. ? M_PI - phi / float(comp.size()) : phi / float(comp.size());
0078 temp = temp >= 0 ? temp : 2 * M_PI + temp;
0079 return temp;
0080 }
0081 }
0082
0083 double CmsTrackerLevelBuilderHelper::getPhiGluedModule(const GeometricDet* a) {
0084 std::vector<const GeometricDet*> comp;
0085 a->deepComponents(comp);
0086 float phi = 0.;
0087 bool sum = true;
0088
0089 for (auto& i : comp) {
0090 if (std::abs(i->phi()) > M_PI / 2.) {
0091 sum = false;
0092 break;
0093 }
0094 }
0095
0096 if (sum) {
0097 for (auto& i : comp) {
0098 phi += i->phi();
0099 }
0100
0101 double temp = phi / float(comp.size()) < 0. ? 2 * M_PI + phi / float(comp.size()) : phi / float(comp.size());
0102 return temp;
0103
0104 } else {
0105 for (auto& i : comp) {
0106 double phi1 = i->phi() >= 0 ? i->phi() : i->translation().phi() + 2 * M_PI;
0107 phi += phi1;
0108 }
0109
0110 double com = comp.front()->phi() >= 0 ? comp.front()->phi() : 2 * M_PI + comp.front()->phi();
0111 double temp =
0112 std::abs(phi / float(comp.size()) - com) > 2. ? M_PI - phi / float(comp.size()) : phi / float(comp.size());
0113 temp = temp >= 0 ? temp : 2 * M_PI + temp;
0114 return temp;
0115 }
0116 }
0117
0118 double CmsTrackerLevelBuilderHelper::getPhiMirror(const GeometricDet* a) {
0119 double phi = a->phi();
0120 phi = (phi >= 0 ? phi : phi + 2 * M_PI);
0121 return ((M_PI - phi) >= 0 ? (M_PI - phi) : (M_PI - phi) + 2 * M_PI);
0122 }
0123
0124 double CmsTrackerLevelBuilderHelper::getPhiModuleMirror(const GeometricDet* a) {
0125 double phi = getPhiModule(a);
0126 phi = (phi <= M_PI ? phi : phi - 2 * M_PI);
0127 return (M_PI - phi);
0128 }
0129
0130 double CmsTrackerLevelBuilderHelper::getPhiGluedModuleMirror(const GeometricDet* a) {
0131 double phi = getPhiGluedModule(a);
0132 phi = (phi <= M_PI ? phi : phi - 2 * M_PI);
0133 return (M_PI - phi);
0134 }
0135
0136 bool CmsTrackerLevelBuilderHelper::isLessRModule(const GeometricDet* a, const GeometricDet* b) {
0137 return a->deepComponents().front()->rho() < b->deepComponents().front()->rho();
0138 }
0139
0140 bool CmsTrackerLevelBuilderHelper::isLessR(const GeometricDet* a, const GeometricDet* b) { return a->rho() < b->rho(); }
0141
0142
0143
0144
0145 template <>
0146 void CmsTrackerLevelBuilder<DDFilteredView>::build(DDFilteredView& fv,
0147 GeometricDet* tracker,
0148 const std::string& attribute) {
0149 if (DEBUG) {
0150 edm::LogVerbatim("CmsTrackerLevelBuilder")
0151 << "CmsTrackerLevelBuilder::build called on volume"
0152 << " tracker->name() = " << tracker->name() << " tracker->path() = " << fv.geoHistory()
0153 << " tracker->type() = " << tracker->type();
0154 }
0155
0156
0157 bool doLayers = fv.firstChild();
0158
0159 while (doLayers) {
0160 if (DEBUG) {
0161 edm::LogVerbatim("CmsTrackerLevelBuilder") << "Calling buildComponent, before";
0162 }
0163
0164
0165 buildComponent(fv, tracker, attribute);
0166
0167 if (DEBUG) {
0168 edm::LogVerbatim("CmsTrackerLevelBuilder") << "Calling buildComponent, after";
0169 }
0170
0171
0172 doLayers = fv.nextSibling();
0173 }
0174
0175
0176 fv.parent();
0177
0178
0179 sortNS(fv, tracker);
0180
0181 if (DEBUG) {
0182 edm::LogVerbatim("CmsTrackerLevelBuilder")
0183 << "CmsTrackerLevelBuilder::build: Exit, finished all buildComponents calls.";
0184 }
0185 }
0186
0187
0188
0189
0190 template <>
0191 void CmsTrackerLevelBuilder<cms::DDFilteredView>::build(cms::DDFilteredView& fv,
0192 GeometricDet* tracker,
0193 const std::string& attribute) {
0194 if (DEBUG) {
0195 edm::LogVerbatim("CmsTrackerLevelBuilder")
0196 << "CmsTrackerLevelBuilder::build called on volume"
0197 << " tracker->name() = " << tracker->name() << " tracker->path() = " << fv.geoHistory()
0198 << " tracker->type() = " << tracker->type();
0199 }
0200
0201
0202 fv.firstChild();
0203
0204
0205 const int level = fv.level();
0206 const std::string& type = ExtractStringFromDDD<cms::DDFilteredView>::getString(attribute, &fv);
0207
0208
0209 while (fv.level() == level) {
0210 if (DEBUG) {
0211 edm::LogVerbatim("CmsTrackerLevelBuilder")
0212 << "Calling buildComponent, before."
0213 << " level = " << level << " type = " << type << " fv.level() = " << fv.level()
0214 << " fv.type() = " << ExtractStringFromDDD<cms::DDFilteredView>::getString(attribute, &fv);
0215 }
0216
0217
0218 buildComponent(fv, tracker, attribute);
0219
0220 if (DEBUG) {
0221 edm::LogVerbatim("CmsTrackerLevelBuilder")
0222 << "Calling buildComponent, after."
0223 << " level = " << level << " type = " << type << " fv.level() = " << fv.level()
0224 << " fv.type() = " << ExtractStringFromDDD<cms::DDFilteredView>::getString(attribute, &fv);
0225 }
0226 }
0227
0228
0229 sortNS(fv, tracker);
0230
0231 if (DEBUG) {
0232 edm::LogVerbatim("CmsTrackerLevelBuilder")
0233 << "CmsTrackerLevelBuilder::build: Exit, finished all buildComponents calls.";
0234 }
0235 }
0236
0237 template class CmsTrackerLevelBuilder<DDFilteredView>;
0238 template class CmsTrackerLevelBuilder<cms::DDFilteredView>;