File indexing completed on 2023-03-17 11:00:58
0001 #include "FastSimulation/Tracking/interface/TrackingLayer.h"
0002 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0003 #include "FWCore/Utilities/interface/Exception.h"
0004 #include "DataFormats/SiStripDetId/interface/StripSubdetector.h"
0005
0006 const TrackingLayer::eqfct TrackingLayer::_eqfct;
0007
0008 TrackingLayer::TrackingLayer() : _subDet(Det::UNKNOWN), _side(Side::BARREL), _layerNumber(0) {}
0009
0010 TrackingLayer TrackingLayer::createFromDetId(const DetId& detId, const TrackerTopology& trackerTopology) {
0011 TrackingLayer trackingLayer;
0012 uint32_t subdet = detId.subdetId();
0013
0014 if (subdet == PixelSubdetector::PixelBarrel) {
0015 trackingLayer._subDet = TrackingLayer::Det::PXB;
0016 trackingLayer._side = TrackingLayer::Side::BARREL;
0017 trackingLayer._layerNumber = trackerTopology.pxbLayer(detId);
0018 }
0019
0020 else if (subdet == PixelSubdetector::PixelEndcap) {
0021 trackingLayer._subDet = TrackingLayer::Det::PXD;
0022 if (trackerTopology.pxfSide(detId) == 1) {
0023 trackingLayer._side = TrackingLayer::Side::NEG_ENDCAP;
0024 } else if (trackerTopology.pxfSide(detId) == 2) {
0025 trackingLayer._side = TrackingLayer::Side::POS_ENDCAP;
0026 } else {
0027 throw cms::Exception("FastSimulation/Tracking")
0028 << "Tracker hit for seeding in FPix seems neither on positive nor on negative disk side: "
0029 << trackerTopology.print(detId).c_str();
0030 }
0031 trackingLayer._layerNumber = trackerTopology.pxfDisk(detId);
0032 }
0033
0034 else if (subdet == StripSubdetector::TIB) {
0035 trackingLayer._subDet = TrackingLayer::Det::TIB;
0036 trackingLayer._side = TrackingLayer::Side::BARREL;
0037 trackingLayer._layerNumber = trackerTopology.tibLayer(detId);
0038 }
0039
0040 else if (subdet == StripSubdetector::TID) {
0041 trackingLayer._subDet = TrackingLayer::Det::TID;
0042 if (trackerTopology.tidSide(detId) == 1) {
0043 trackingLayer._side = TrackingLayer::Side::NEG_ENDCAP;
0044 } else if (trackerTopology.tidSide(detId) == 2) {
0045 trackingLayer._side = TrackingLayer::Side::POS_ENDCAP;
0046 } else {
0047 throw cms::Exception("FastSimulation/Tracking")
0048 << "Tracker hit for seeding in TID seems neither on positive nor on negative disk side: "
0049 << trackerTopology.print(detId).c_str();
0050 }
0051 trackingLayer._layerNumber = trackerTopology.tidWheel(detId);
0052 }
0053
0054 else if (subdet == StripSubdetector::TOB) {
0055 trackingLayer._subDet = TrackingLayer::Det::TOB;
0056 trackingLayer._side = TrackingLayer::Side::BARREL;
0057 trackingLayer._layerNumber = trackerTopology.tobLayer(detId);
0058 }
0059
0060 else if (subdet == StripSubdetector::TEC) {
0061 trackingLayer._subDet = TrackingLayer::Det::TEC;
0062 if (trackerTopology.tecSide(detId) == 1) {
0063 trackingLayer._side = TrackingLayer::Side::NEG_ENDCAP;
0064 } else if (trackerTopology.tecSide(detId) == 2) {
0065 trackingLayer._side = TrackingLayer::Side::POS_ENDCAP;
0066 } else {
0067 throw cms::Exception("FastSimulation/Tracking")
0068 << "Tracker hit for seeding in TEC seems neither on positive nor on negative disk side: "
0069 << trackerTopology.print(detId).c_str();
0070 }
0071 trackingLayer._layerNumber = trackerTopology.tecWheel(detId);
0072 } else {
0073 throw cms::Exception("FastSimulation/Tracking")
0074 << "Cannot determine seeding layer from DetId:" << trackerTopology.print(detId).c_str() << std::endl;
0075 }
0076 edm::LogVerbatim("TrackingLayer") << "LayerSpec::createFromDetId: " << trackerTopology.print(detId).c_str()
0077 << ", parsed=" << trackingLayer._layerNumber;
0078 return trackingLayer;
0079 }
0080
0081 TrackingLayer TrackingLayer::createFromString(std::string layerSpecification) {
0082 TrackingLayer trackingLayer;
0083 if (layerSpecification.substr(0, 4) == "BPix") {
0084 trackingLayer._subDet = TrackingLayer::Det::PXB;
0085 trackingLayer._side = TrackingLayer::Side::BARREL;
0086 trackingLayer._layerNumber = std::atoi(layerSpecification.substr(4, 1).c_str());
0087 } else if (layerSpecification.substr(0, 4) == "FPix") {
0088 trackingLayer._subDet = TrackingLayer::Det::PXD;
0089 trackingLayer._layerNumber = std::atoi(layerSpecification.substr(4, 1).c_str());
0090 if (layerSpecification.substr(layerSpecification.size() - 3) == "pos") {
0091 trackingLayer._side = TrackingLayer::Side::POS_ENDCAP;
0092 } else if (layerSpecification.substr(layerSpecification.size() - 3) == "neg") {
0093 trackingLayer._side = TrackingLayer::Side::NEG_ENDCAP;
0094 } else {
0095 throw cms::Exception("FastSimulation/Tracking/python")
0096 << "FPix seeding layer configuration '" << layerSpecification.c_str()
0097 << "' does not specify the side correctly!";
0098 }
0099
0100 } else if (layerSpecification.substr(0, 3) == "TIB") {
0101 trackingLayer._subDet = TrackingLayer::Det::TIB;
0102 trackingLayer._side = TrackingLayer::Side::BARREL;
0103 trackingLayer._layerNumber = std::atoi(layerSpecification.substr(3, 1).c_str());
0104 } else if (layerSpecification.substr(0, 4) == "MTIB") {
0105 trackingLayer._subDet = TrackingLayer::Det::TIB;
0106 trackingLayer._side = TrackingLayer::Side::BARREL;
0107 trackingLayer._layerNumber = std::atoi(layerSpecification.substr(4, 1).c_str());
0108 }
0109
0110 else if (layerSpecification.substr(0, 3) == "TID") {
0111 trackingLayer._subDet = TrackingLayer::Det::TID;
0112 trackingLayer._layerNumber = std::atoi(layerSpecification.substr(3, 1).c_str());
0113 if (layerSpecification.substr(layerSpecification.size() - 3) == "pos") {
0114 trackingLayer._side = TrackingLayer::Side::POS_ENDCAP;
0115 } else if (layerSpecification.substr(layerSpecification.size() - 3) == "neg") {
0116 trackingLayer._side = TrackingLayer::Side::NEG_ENDCAP;
0117 } else {
0118 throw cms::Exception("FastSimulation/Tracking/python")
0119 << "TID seeding layer configuration '" << layerSpecification.c_str()
0120 << "' does not specify the side correctly!";
0121 }
0122 } else if (layerSpecification.substr(0, 4) == "MTID") {
0123 trackingLayer._subDet = TrackingLayer::Det::TID;
0124 trackingLayer._layerNumber = std::atoi(layerSpecification.substr(4, 1).c_str());
0125 if (layerSpecification.substr(layerSpecification.size() - 3) == "pos") {
0126 trackingLayer._side = TrackingLayer::Side::POS_ENDCAP;
0127 } else if (layerSpecification.substr(layerSpecification.size() - 3) == "neg") {
0128 trackingLayer._side = TrackingLayer::Side::NEG_ENDCAP;
0129 } else {
0130 throw cms::Exception("FastSimulation/Tracking/python")
0131 << "MTID seeding layer configuration '" << layerSpecification.c_str()
0132 << "' does not specify the side correctly!";
0133 }
0134 } else if (layerSpecification.substr(0, 3) == "TOB") {
0135 trackingLayer._subDet = TrackingLayer::Det::TOB;
0136 trackingLayer._side = TrackingLayer::Side::BARREL;
0137 trackingLayer._layerNumber = std::atoi(layerSpecification.substr(3, 1).c_str());
0138 } else if (layerSpecification.substr(0, 4) == "MTOB") {
0139 trackingLayer._subDet = TrackingLayer::Det::TOB;
0140 trackingLayer._side = TrackingLayer::Side::BARREL;
0141 trackingLayer._layerNumber = std::atoi(layerSpecification.substr(4, 1).c_str());
0142 } else if (layerSpecification.substr(0, 3) == "TEC") {
0143 trackingLayer._subDet = TrackingLayer::Det::TEC;
0144 trackingLayer._layerNumber = std::atoi(layerSpecification.substr(3, 1).c_str());
0145 if (layerSpecification.substr(layerSpecification.size() - 3) == "pos") {
0146 trackingLayer._side = TrackingLayer::Side::POS_ENDCAP;
0147 } else if (layerSpecification.substr(layerSpecification.size() - 3) == "neg") {
0148 trackingLayer._side = TrackingLayer::Side::NEG_ENDCAP;
0149 } else {
0150 throw cms::Exception("FastSimulation/Tracking/python")
0151 << "TEC seeding layer configuration '" << layerSpecification.c_str()
0152 << "' does not specify the side correctly!";
0153 }
0154
0155 } else if (layerSpecification.substr(0, 4) == "MTEC") {
0156 trackingLayer._subDet = TrackingLayer::Det::TEC;
0157 trackingLayer._layerNumber = std::atoi(layerSpecification.substr(4, 1).c_str());
0158 if (layerSpecification.substr(layerSpecification.size() - 3) == "pos") {
0159 trackingLayer._side = TrackingLayer::Side::POS_ENDCAP;
0160 } else if (layerSpecification.substr(layerSpecification.size() - 3) == "neg") {
0161 trackingLayer._side = TrackingLayer::Side::NEG_ENDCAP;
0162 } else {
0163 throw cms::Exception("FastSimulation/Tracking/python")
0164 << "MTEC seeding layer configuration '" << layerSpecification.c_str()
0165 << "' does not specify the side correctly!";
0166 }
0167 } else {
0168 throw cms::Exception("FastSimulation/Tracking/python")
0169 << "Bad data naming in seeding layer configuration."
0170 << "no case sensitive name of ['BPix','FPix','TIB','MTIB','TID','MTID','TOB','TEC','MTEC'] matches '"
0171 << layerSpecification.c_str() << "'";
0172 }
0173 edm::LogVerbatim("TrackingLayer") << "LayerSpec::createFromString: " << layerSpecification.c_str()
0174 << ", parsed=" << trackingLayer._layerNumber;
0175
0176 return trackingLayer;
0177 }
0178
0179 std::string TrackingLayer::toString() const {
0180 std::stringstream ss;
0181 switch (_subDet) {
0182 case TrackingLayer::Det::UNKNOWN:
0183 ss << "unknown";
0184 break;
0185 case TrackingLayer::Det::PXB:
0186 ss << " BPix";
0187 break;
0188 case TrackingLayer::Det::PXD:
0189 ss << " FPix";
0190 break;
0191 case TrackingLayer::Det::TIB:
0192 ss << " TIB";
0193 break;
0194 case TrackingLayer::Det::TID:
0195 ss << " TID";
0196 break;
0197 case TrackingLayer::Det::TOB:
0198 ss << " TOB";
0199 break;
0200 case TrackingLayer::Det::TEC:
0201 ss << " TEC";
0202 break;
0203 }
0204 ss << _layerNumber;
0205 switch (_side) {
0206 case TrackingLayer::Side::BARREL:
0207 break;
0208 case Side::NEG_ENDCAP:
0209 ss << "_neg";
0210 break;
0211 case TrackingLayer::Side::POS_ENDCAP:
0212 ss << "_pos";
0213 break;
0214 }
0215
0216 return ss.str();
0217 }
0218
0219 std::string TrackingLayer::toIdString() const {
0220 std::stringstream ss;
0221 ss << getSubDetNumber() << ":" << getLayerNumber() << ":" << getSideNumber();
0222 return ss.str();
0223 }