Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-10-25 10:01:05

0001 /** \file
0002  *
0003  *  \author L. Gray - FNAL
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   // Build BTL layers
0045   this->addBTLLayers(BTLDetLayerGeometryBuilder::buildLayers(*geo, *mtopo));
0046   // Build ETL layers, depends on the scenario
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");  // << detLayer->module();
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) {  // 2 is ETL
0107     ETLDetId etlId(detId.rawId());
0108     idout = ETLDetId(etlId.mtdSide(), 0, 0, 0);
0109   } else if (detId.mtdSubDetector() == 1) {  // 1 is BTL
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 // Quick way to sort barrel det layers by increasing R,
0122 // do not abuse!
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   // The following are filled inside-out, no need to re-sort
0137   // precomputed_value_sort(dtLayers.begin(), dtLayers.end(),ExtractR<DetLayer,float>());
0138   // precomputed_value_sort(cscLayers_fw.begin(), cscLayers_fw.end(),ExtractAbsZ<DetLayer,float>());
0139   // precomputed_value_sort(cscLayers_bk.begin(), cscLayers_bk.end(),ExtractAbsZ<DetLayer,float>());
0140   // precomputed_value_sort(rpcLayers_fw.begin(), rpcLayers_fw.end(),ExtractAbsZ<DetLayer,float>());
0141   // precomputed_value_sort(rpcLayers_bk.begin(), rpcLayers_bk.end(),ExtractAbsZ<DetLayer,float>());
0142   // precomputed_value_sort(rpcLayers_barrel.begin(), rpcLayers_barrel.end(), ExtractR<DetLayer,float>());
0143 
0144   // Sort these inside-out
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   // Build more complicated vectors with correct sorting
0150 
0151   //etlLayers_all: from -Z to +Z
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   // allEndcap: order is  all bw, all fw
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   // allDetLayers: order is  all bw, all barrel, all fw
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   // number layers
0171   int sq = 0;
0172   for (auto l : allDetLayers)
0173     (*const_cast<DetLayer*>(l)).setSeqNum(sq++);
0174 }