Back to home page

Project CMSSW displayed by LXR

 
 

    


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   //BPix
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   //FPix
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   //TIB
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   //TID
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   //TOB
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   //TEC
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 }