File indexing completed on 2023-10-25 10:01:05
0001
0002
0003
0004
0005
0006
0007 #include <RecoMTD/DetLayers/interface/MTDDetLayerGeometry.h>
0008 #include <RecoMTD/DetLayers/interface/ETLDetLayerGeometryBuilder.h>
0009 #include <RecoMTD/DetLayers/interface/BTLDetLayerGeometryBuilder.h>
0010
0011 #include <FWCore/Utilities/interface/Exception.h>
0012 #include <TrackingTools/DetLayers/interface/DetLayer.h>
0013 #include <DataFormats/ForwardDetId/interface/BTLDetId.h>
0014 #include <DataFormats/ForwardDetId/interface/ETLDetId.h>
0015
0016 #include <Utilities/General/interface/precomputed_value_sort.h>
0017 #include <DataFormats/GeometrySurface/interface/GeometricSorting.h>
0018
0019 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0020 #include <algorithm>
0021
0022 using namespace std;
0023 using namespace geomsort;
0024 using namespace edm;
0025
0026 MTDDetLayerGeometry::MTDDetLayerGeometry() {}
0027
0028 MTDDetLayerGeometry::~MTDDetLayerGeometry() {}
0029
0030 void MTDDetLayerGeometry::buildLayers(const MTDGeometry* geo, const MTDTopology* mtopo) {
0031 bool abort(false);
0032 if (geo == nullptr) {
0033 LogError("MTDDetLayers") << "No MTD geometry is available.";
0034 abort = true;
0035 }
0036 if (mtopo == nullptr) {
0037 LogError("MTDDetLayers") << "No MTD topology is available.";
0038 abort = true;
0039 }
0040 if (abort) {
0041 throw cms::Exception("MTDDetLayers") << "No complete MTD geometry available, aborting.";
0042 }
0043
0044
0045 this->addBTLLayers(BTLDetLayerGeometryBuilder::buildLayers(*geo, *mtopo));
0046
0047 this->addETLLayers(ETLDetLayerGeometryBuilder::buildLayers(*geo, *mtopo));
0048 }
0049
0050 void MTDDetLayerGeometry::addETLLayers(const pair<vector<DetLayer*>, vector<DetLayer*> >& etllayers) {
0051 for (auto const it : etllayers.first) {
0052 etlLayers_fw.push_back(it);
0053 allForward.push_back(it);
0054
0055 detLayersMap[makeDetLayerId(it)] = it;
0056 }
0057
0058 for (auto const it : etllayers.second) {
0059 etlLayers_bk.push_back(it);
0060 allBackward.push_back(it);
0061
0062 detLayersMap[makeDetLayerId(it)] = it;
0063 }
0064 }
0065
0066 void MTDDetLayerGeometry::addBTLLayers(const vector<DetLayer*>& dtlayers) {
0067 for (auto const it : dtlayers) {
0068 btlLayers.push_back(it);
0069 allBarrel.push_back(it);
0070
0071 detLayersMap[makeDetLayerId(it)] = it;
0072 }
0073 }
0074
0075 DetId MTDDetLayerGeometry::makeDetLayerId(const DetLayer* detLayer) const {
0076 if (detLayer->subDetector() == GeomDetEnumerators::TimingEndcap) {
0077 ETLDetId id(detLayer->basicComponents().front()->geographicalId().rawId());
0078 return ETLDetId(id.mtdSide(), 0, 0, 0);
0079 } else if (detLayer->subDetector() == GeomDetEnumerators::TimingBarrel) {
0080 BTLDetId id(detLayer->basicComponents().front()->geographicalId().rawId());
0081 return BTLDetId(id.mtdSide(), 0, 0, 0, 0);
0082 } else
0083 throw cms::Exception("InvalidModuleIdentification");
0084 }
0085
0086 const vector<const DetLayer*>& MTDDetLayerGeometry::allBarrelLayers() const { return allBarrel; }
0087
0088 const vector<const DetLayer*>& MTDDetLayerGeometry::allEndcapLayers() const { return allEndcap; }
0089
0090 const vector<const DetLayer*>& MTDDetLayerGeometry::allForwardLayers() const { return allForward; }
0091
0092 const vector<const DetLayer*>& MTDDetLayerGeometry::allBackwardLayers() const { return allBackward; }
0093
0094 const vector<const DetLayer*>& MTDDetLayerGeometry::allBTLLayers() const { return btlLayers; }
0095
0096 const vector<const DetLayer*>& MTDDetLayerGeometry::allETLLayers() const { return etlLayers_all; }
0097
0098 const vector<const DetLayer*>& MTDDetLayerGeometry::allLayers() const { return allDetLayers; }
0099
0100
0101
0102 const DetLayer* MTDDetLayerGeometry::idToLayer(const DetId& id) const {
0103 DetId idout;
0104 MTDDetId detId(id);
0105
0106 if (detId.mtdSubDetector() == 2) {
0107 ETLDetId etlId(detId.rawId());
0108 idout = ETLDetId(etlId.mtdSide(), 0, 0, 0);
0109 } else if (detId.mtdSubDetector() == 1) {
0110 BTLDetId btlId(detId.rawId());
0111 idout = BTLDetId(btlId.mtdSide(), 0, 0, 0, 0);
0112 } else
0113 throw cms::Exception("InvalidSubdetId") << detId.subdetId();
0114
0115 std::map<DetId, const DetLayer*>::const_iterator layer = detLayersMap.find(idout);
0116 if (layer == detLayersMap.end())
0117 return nullptr;
0118 return layer->second;
0119 }
0120
0121
0122
0123 #include <TrackingTools/DetLayers/interface/BarrelDetLayer.h>
0124 struct ExtractBarrelDetLayerR {
0125 typedef Surface::Scalar result_type;
0126 result_type operator()(const DetLayer* p) const {
0127 const BarrelDetLayer* bdl = dynamic_cast<const BarrelDetLayer*>(p);
0128 if (bdl)
0129 return bdl->specificSurface().radius();
0130 else
0131 return -1.;
0132 }
0133 };
0134
0135 void MTDDetLayerGeometry::sortLayers() {
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145 precomputed_value_sort(allBarrel.begin(), allBarrel.end(), ExtractBarrelDetLayerR());
0146 precomputed_value_sort(allBackward.begin(), allBackward.end(), ExtractAbsZ<DetLayer, float>());
0147 precomputed_value_sort(allForward.begin(), allForward.end(), ExtractAbsZ<DetLayer, float>());
0148
0149
0150
0151
0152 etlLayers_all.reserve(etlLayers_bk.size() + etlLayers_fw.size());
0153 std::copy(etlLayers_bk.begin(), etlLayers_bk.end(), back_inserter(etlLayers_all));
0154 std::reverse(etlLayers_all.begin(), etlLayers_all.end());
0155 std::copy(etlLayers_fw.begin(), etlLayers_fw.end(), back_inserter(etlLayers_all));
0156
0157
0158 allEndcap.reserve(allBackward.size() + allForward.size());
0159 std::copy(allBackward.begin(), allBackward.end(), back_inserter(allEndcap));
0160 std::reverse(allEndcap.begin(), allEndcap.end());
0161 std::copy(allForward.begin(), allForward.end(), back_inserter(allEndcap));
0162
0163
0164 allDetLayers.reserve(allBackward.size() + allBarrel.size() + allForward.size());
0165 std::copy(allBackward.begin(), allBackward.end(), back_inserter(allDetLayers));
0166 std::reverse(allDetLayers.begin(), allDetLayers.end());
0167 std::copy(allBarrel.begin(), allBarrel.end(), back_inserter(allDetLayers));
0168 std::copy(allForward.begin(), allForward.end(), back_inserter(allDetLayers));
0169
0170
0171 int sq = 0;
0172 for (auto l : allDetLayers)
0173 (*const_cast<DetLayer*>(l)).setSeqNum(sq++);
0174 }