File indexing completed on 2024-04-06 12:15:29
0001 #include "Geometry/TrackerNumberingBuilder/plugins/CmsTrackerOTLayerBuilder.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 "Geometry/TrackerNumberingBuilder/plugins/CmsTrackerOTRingBuilder.h"
0007 #include "Geometry/TrackerNumberingBuilder/plugins/CmsTrackerLadderBuilder.h"
0008 #include "Geometry/TrackerNumberingBuilder/interface/trackerStablePhiSort.h"
0009 #include "DataFormats/DetId/interface/DetId.h"
0010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0011
0012 #include <vector>
0013 #include <bitset>
0014
0015 template <class FilteredView>
0016 void CmsTrackerOTLayerBuilder<FilteredView>::buildComponent(FilteredView& fv, GeometricDet* g, const std::string& s) {
0017 LogTrace("DetConstruction") << " CmsTrackerOTLayerBuilder::buildComponent ";
0018 CmsTrackerLadderBuilder<FilteredView> theCmsTrackerLadderBuilder;
0019 CmsTrackerOTRingBuilder<FilteredView> theCmsTrackerOTRingBuilder;
0020
0021 GeometricDet* subdet = new GeometricDet(&fv,
0022 CmsTrackerLevelBuilder<FilteredView>::theCmsTrackerStringToEnum.type(
0023 ExtractStringFromDDD<FilteredView>::getString(s, &fv)));
0024 switch (CmsTrackerLevelBuilder<FilteredView>::theCmsTrackerStringToEnum.type(
0025 ExtractStringFromDDD<FilteredView>::getString(s, &fv))) {
0026 case GeometricDet::ladder:
0027 theCmsTrackerLadderBuilder.build(fv, subdet, s);
0028 break;
0029 case GeometricDet::panel:
0030 theCmsTrackerOTRingBuilder.build(fv, subdet, s);
0031 break;
0032 default:
0033 edm::LogError("CmsTrackerOTLayerBuilder") << " ERROR - I was expecting a ladder or a panel, I got a "
0034 << ExtractStringFromDDD<FilteredView>::getString(s, &fv);
0035 }
0036 g->addComponent(subdet);
0037 }
0038
0039 template <class FilteredView>
0040 void CmsTrackerOTLayerBuilder<FilteredView>::sortNS(FilteredView& fv, GeometricDet* det) {
0041 GeometricDet::ConstGeometricDetContainer comp = det->components();
0042
0043
0044 GeometricDet::GeometricDetContainer rods;
0045 GeometricDet::GeometricDetContainer ringsNeg;
0046 GeometricDet::GeometricDetContainer ringsPos;
0047 rods.clear();
0048 ringsNeg.clear();
0049 ringsPos.clear();
0050
0051 for (uint32_t i = 0; i < comp.size(); i++) {
0052 auto component = det->component(i);
0053 if (component->type() == GeometricDet::ladder) {
0054 rods.emplace_back(component);
0055 } else if (component->type() == GeometricDet::panel) {
0056 if (component->translation().z() < 0.) {
0057 ringsNeg.emplace_back(component);
0058 } else if (component->translation().z() > 0.) {
0059 ringsPos.emplace_back(component);
0060 }
0061 } else {
0062 edm::LogError("CmsTrackerOTLayerBuilder")
0063 << "ERROR - wrong SubDet to sort..... " << det->components().front()->type();
0064 }
0065 }
0066
0067
0068 if (!ringsNeg.empty()) {
0069 std::sort(ringsNeg.begin(), ringsNeg.end(), CmsTrackerLevelBuilderHelper::isLessZ);
0070 uint32_t totalringsNeg = ringsNeg.size();
0071
0072 LogTrace("DetConstruction") << " Neg rings ordered by z: ";
0073 for (uint32_t ring = 0; ring < totalringsNeg; ring++) {
0074 uint32_t temp = ring + 1;
0075 temp |= (1 << 8);
0076 ringsNeg[ring]->setGeographicalID(temp);
0077 LogTrace("BuildingTrackerDetId") << "\t\t\t DetId >> " << temp
0078 << "(r: " << sqrt(ringsNeg[ring]->translation().Perp2())
0079 << ", phi: " << ringsNeg[ring]->phi()
0080 << ", z: " << ringsNeg[ring]->translation().z() << ")";
0081 }
0082 }
0083
0084
0085 if (!rods.empty()) {
0086 trackerStablePhiSort(rods.begin(), rods.end(), CmsTrackerLevelBuilderHelper::getPhi);
0087 uint32_t totalrods = rods.size();
0088
0089 LogTrace("DetConstruction") << " Rods ordered by phi: ";
0090 for (uint32_t rod = 0; rod < totalrods; rod++) {
0091 uint32_t temp = rod + 1;
0092 temp |= (3 << 8);
0093 rods[rod]->setGeographicalID(DetId(temp));
0094 LogTrace("BuildingTrackerDetId") << "\t\t\t DetId >> " << temp << "(r: " << sqrt(rods[rod]->translation().Perp2())
0095 << ", phi: " << rods[rod]->phi() << ", z: " << rods[rod]->translation().z()
0096 << ")";
0097 }
0098 }
0099
0100
0101 if (!ringsPos.empty()) {
0102 std::sort(ringsPos.begin(), ringsPos.end(), CmsTrackerLevelBuilderHelper::isLessZ);
0103 uint32_t totalringsPos = ringsPos.size();
0104
0105 LogTrace("DetConstruction") << " Pos rings ordered by z: ";
0106 for (uint32_t ring = 0; ring < totalringsPos; ring++) {
0107 uint32_t temp = ring + 1;
0108 temp |= (2 << 8);
0109 ringsPos[ring]->setGeographicalID(temp);
0110 LogTrace("BuildingTrackerDetId") << "\t\t\t DetId >> " << temp
0111 << "(r: " << sqrt(ringsPos[ring]->translation().Perp2())
0112 << ", phi: " << ringsPos[ring]->phi()
0113 << ", z: " << ringsPos[ring]->translation().z() << ")";
0114 }
0115 }
0116
0117 det->clearComponents();
0118 det->addComponents(ringsNeg);
0119 det->addComponents(rods);
0120 det->addComponents(ringsPos);
0121 }
0122
0123 template class CmsTrackerOTLayerBuilder<DDFilteredView>;
0124 template class CmsTrackerOTLayerBuilder<cms::DDFilteredView>;