File indexing completed on 2024-04-06 12:15:29
0001 #include "Geometry/TrackerNumberingBuilder/plugins/CmsTrackerWheelBuilder.h"
0002 #include "DetectorDescription/Core/interface/DDFilteredView.h"
0003 #include "DetectorDescription/DDCMS/interface/DDFilteredView.h"
0004 #include "Geometry/TrackerNumberingBuilder/interface/GeometricDet.h"
0005 #include "Geometry/TrackerNumberingBuilder/plugins/ExtractStringFromDDD.h"
0006 #include "DataFormats/DetId/interface/DetId.h"
0007 #include "Geometry/TrackerNumberingBuilder/plugins/CmsTrackerRingBuilder.h"
0008 #include "Geometry/TrackerNumberingBuilder/plugins/CmsTrackerPetalBuilder.h"
0009 #include "Geometry/TrackerNumberingBuilder/interface/trackerStablePhiSort.h"
0010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0011
0012 #include <vector>
0013 #include <bitset>
0014
0015 template <class FilteredView>
0016 void CmsTrackerWheelBuilder<FilteredView>::buildComponent(FilteredView& fv, GeometricDet* g, const std::string& s) {
0017 CmsTrackerRingBuilder<FilteredView> theCmsTrackerRingBuilder;
0018 CmsTrackerPetalBuilder<FilteredView> theCmsTrackerPetalBuilder;
0019
0020 GeometricDet* subdet = new GeometricDet(&fv,
0021 CmsTrackerLevelBuilder<FilteredView>::theCmsTrackerStringToEnum.type(
0022 ExtractStringFromDDD<FilteredView>::getString(s, &fv)));
0023 switch (CmsTrackerLevelBuilder<FilteredView>::theCmsTrackerStringToEnum.type(
0024 ExtractStringFromDDD<FilteredView>::getString(s, &fv))) {
0025 case GeometricDet::ring:
0026 theCmsTrackerRingBuilder.build(fv, subdet, s);
0027 break;
0028 case GeometricDet::petal:
0029 theCmsTrackerPetalBuilder.build(fv, subdet, s);
0030 break;
0031 default:
0032 edm::LogError("CmsTrackerWheelBuilder") << " ERROR - I was expecting a Ring or Petal, I got a "
0033 << ExtractStringFromDDD<FilteredView>::getString(s, &fv);
0034 }
0035 g->addComponent(subdet);
0036 }
0037
0038 template <class FilteredView>
0039 void CmsTrackerWheelBuilder<FilteredView>::sortNS(FilteredView& fv, GeometricDet* det) {
0040 GeometricDet::ConstGeometricDetContainer& comp = det->components();
0041
0042 if (!comp.empty()) {
0043 if (comp.front()->type() == GeometricDet::petal) {
0044 GeometricDet::GeometricDetContainer compfw;
0045 GeometricDet::GeometricDetContainer compbw;
0046 compfw.clear();
0047 compbw.clear();
0048 for (uint32_t i = 0; i < comp.size(); i++) {
0049 if (std::abs(comp[i]->translation().z()) < std::abs(det->translation().z())) {
0050 compfw.emplace_back(det->component(i));
0051 } else {
0052 compbw.emplace_back(det->component(i));
0053 }
0054 }
0055
0056 trackerStablePhiSort(compfw.begin(), compfw.end(), CmsTrackerLevelBuilderHelper::getPhiModule);
0057 trackerStablePhiSort(compbw.begin(), compbw.end(), CmsTrackerLevelBuilderHelper::getPhiModule);
0058
0059
0060
0061
0062
0063
0064 for (uint32_t i = 0; i < compbw.size(); i++) {
0065 uint32_t temp = i + 1;
0066 temp |= (1 << 4);
0067 compbw[i]->setGeographicalID(DetId(temp));
0068 }
0069 for (uint32_t i = 0; i < compfw.size(); i++) {
0070 uint32_t temp = i + 1;
0071 temp |= (2 << 4);
0072 compfw[i]->setGeographicalID(DetId(temp));
0073 }
0074
0075 det->clearComponents();
0076 det->addComponents(compfw);
0077 det->addComponents(compbw);
0078
0079 } else {
0080 std::stable_sort(comp.begin(), comp.end(), CmsTrackerLevelBuilderHelper::isLessRModule);
0081
0082
0083
0084 for (uint32_t i = 0; i < comp.size(); i++) {
0085 det->component(i)->setGeographicalID(DetId(i + 1));
0086 }
0087 }
0088 } else {
0089 edm::LogError("CmsTrackerWheelBuilder") << "Where are the Petals or Rings?";
0090 }
0091 }
0092
0093 template class CmsTrackerWheelBuilder<DDFilteredView>;
0094 template class CmsTrackerWheelBuilder<cms::DDFilteredView>;