diff --git a/DetectorDescription/GeoModel/GeoModelTest/CMakeLists.txt b/DetectorDescription/GeoModel/GeoModelTest/CMakeLists.txt index 59715098c31f3df1087004edb8fb89774f652097..38082b667f9f6fb9d93f3a398859dfc11a3b00f0 100644 --- a/DetectorDescription/GeoModel/GeoModelTest/CMakeLists.txt +++ b/DetectorDescription/GeoModel/GeoModelTest/CMakeLists.txt @@ -11,6 +11,7 @@ atlas_depends_on_subdirs( PRIVATE DetectorDescription/GeoModel/GeoModelInterfaces DetectorDescription/GeoModel/GeoModelUtilities Scintillator/ScintDetDescr/ScintReadoutGeometry + Tracker/TrackerDetDescr/TrackerReadoutGeometry ) # External dependencies: @@ -21,7 +22,7 @@ atlas_add_component( GeoModelTest src/GeoModelTestAlg.cxx src/components/GeoModelTest_entries.cxx INCLUDE_DIRS ${GEOMODEL_INCLUDE_DIRS} - LINK_LIBRARIES ${GEOMODEL_LIBRARIES} AthenaBaseComps GeoModelUtilities ScintReadoutGeometry ) + LINK_LIBRARIES ${GEOMODEL_LIBRARIES} AthenaBaseComps GeoModelUtilities ScintReadoutGeometry TrackerReadoutGeometry ) atlas_add_test( GeoModelCheck SCRIPT python/GeoModelTestConfig.py diff --git a/DetectorDescription/GeoModel/GeoModelTest/src/GeoModelTestAlg.cxx b/DetectorDescription/GeoModel/GeoModelTest/src/GeoModelTestAlg.cxx index 219082c599f8ff2214ab500f17809dfe3698673e..0566551950f73ca1e15c93bc1c99a27d94c50979 100644 --- a/DetectorDescription/GeoModel/GeoModelTest/src/GeoModelTestAlg.cxx +++ b/DetectorDescription/GeoModel/GeoModelTest/src/GeoModelTestAlg.cxx @@ -4,8 +4,13 @@ #include "GeoModelUtilities/GeoModelExperiment.h" #include "ScintReadoutGeometry/VetoDetectorManager.h" +#include "TrackerReadoutGeometry/SCT_DetectorManager.h" + #include "ScintReadoutGeometry/ScintDetectorElement.h" +#include "TrackerReadoutGeometry/SiDetectorElement.h" + #include "ScintIdentifier/VetoID.h" +#include "TrackerIdentifier/FaserSCT_ID.h" GeoModelTestAlg::GeoModelTestAlg(const std::string& name, ISvcLocator* pSvcLocator) @@ -51,6 +56,349 @@ StatusCode GeoModelTestAlg::execute() ATH_CHECK(testVeto()); + ATH_CHECK(testSCT()); + + return StatusCode::SUCCESS; +} + +StatusCode GeoModelTestAlg::testSCT() +{ + // Test retrieval of helper object directly from store + const FaserSCT_ID* helper = nullptr; + ATH_CHECK(detStore()->retrieve(helper, "FaserSCT_ID")); + if (helper != nullptr) + { + // Test neighbors with helper function + const IdContext& context = helper->wafer_context(); + ATH_MSG_ALWAYS("Retrieved FaserSCT_ID helper from DetStore."); + for (int iStation = -m_numSctStations/2; iStation <= m_numSctStations/2; iStation++) + { + if (m_numSctStations%2 == 0 && iStation == 0) continue; + for (int iPlane = 0; iPlane < m_numSctPlanesPerStation; iPlane++) + { + for (int iRow = 0; iRow < m_numSctRowsPerPlane; iRow++) + { + for (int iModule = -m_numSctModulesPerRow/2; iModule <= m_numSctModulesPerRow/2; iModule++) + { + if (m_numSctModulesPerRow%2 == 0 && iModule == 0) continue; + for (int iSensor = 0; iSensor < 2; iSensor++) + { + Identifier thisId = helper->wafer_id(iStation, iPlane, iRow, iModule, iSensor, true); + IdentifierHash thisHash = helper->wafer_hash(thisId); + IdentifierHash prevHash; + IdentifierHash nextHash; + IdentifierHash flipHash; + Identifier prevId; + Identifier nextId; + Identifier flipId; + const int INVALID = std::numeric_limits<int>::min(); + int prevPhiStation { INVALID }; + int nextPhiStation { INVALID }; + int prevPhiPlane { INVALID }; + int nextPhiPlane { INVALID }; + int prevPhiRow { INVALID }; + int nextPhiRow { INVALID }; + int prevPhiModule { INVALID }; + int nextPhiModule { INVALID }; + int prevPhiSensor { INVALID }; + int nextPhiSensor { INVALID }; + int prevPhiStat = helper->get_prev_in_phi(thisHash, prevHash); + if (prevPhiStat == 0) + { + IdentifierHash testHash; + int nextPhiStat = helper->get_next_in_phi(prevHash, testHash); + if (nextPhiStat != 0 || testHash != thisHash) + { + ATH_MSG_FATAL("Next SCT module in phi (" << testHash << ") of previous in phi (" << prevHash << ") is not the original (" << thisHash <<")" ); + return StatusCode::FAILURE; + } + prevPhiStat = helper->get_id(prevHash, prevId, &context); + if (prevPhiStat == 0) + { + prevPhiStation = helper->station(prevId); + prevPhiPlane = helper->layer(prevId); + prevPhiRow = helper->phi_module(prevId); + prevPhiModule = helper->eta_module(prevId); + prevPhiSensor = helper->side(prevId); + } + } + int nextPhiStat = helper->get_next_in_phi(thisHash, nextHash); + if (nextPhiStat == 0) + { + IdentifierHash testHash; + prevPhiStat = helper->get_prev_in_phi(nextHash, testHash); + if (prevPhiStat != 0 || testHash != thisHash) + { + ATH_MSG_FATAL("Previous SCT Module in phi (" << testHash << ") of next in phi (" << nextHash << ") is not the original (" << thisHash <<")" ); + return StatusCode::FAILURE; + } + nextPhiStat = helper->get_id(nextHash, nextId, &context); + if (nextPhiStat == 0) + { + nextPhiStation = helper->station(nextId); + nextPhiPlane = helper->layer(nextId); + nextPhiRow = helper->phi_module(nextId); + nextPhiModule = helper->eta_module(nextId); + nextPhiSensor = helper->side(nextId); + } + } + int prevEtaStation { INVALID }; + int nextEtaStation { INVALID }; + int prevEtaPlane { INVALID }; + int nextEtaPlane { INVALID }; + int prevEtaRow { INVALID }; + int nextEtaRow { INVALID }; + int prevEtaModule { INVALID }; + int nextEtaModule { INVALID }; + int prevEtaSensor { INVALID }; + int nextEtaSensor { INVALID }; + int prevEtaStat = helper->get_prev_in_eta(thisHash, prevHash); + if (prevEtaStat == 0) + { + IdentifierHash testHash; + int nextEtaStat = helper->get_next_in_eta(prevHash, testHash); + if (nextEtaStat != 0 || testHash != thisHash) + { + ATH_MSG_FATAL("Next SCT module in eta (" << testHash << ") of previous in eta (" << prevHash << ") is not the original (" << thisHash <<")" ); + return StatusCode::FAILURE; + } + prevEtaStat = helper->get_id(prevHash, prevId, &context); + if (prevEtaStat == 0) + { + prevEtaStation = helper->station(prevId); + prevEtaPlane = helper->layer(prevId); + prevEtaRow = helper->phi_module(prevId); + prevEtaModule = helper->eta_module(prevId); + prevEtaSensor = helper->side(prevId); + } + } + int nextEtaStat = helper->get_next_in_eta(thisHash, nextHash); + if (nextEtaStat == 0) + { + IdentifierHash testHash; + prevEtaStat = helper->get_prev_in_eta(nextHash, testHash); + if (prevEtaStat != 0 || testHash != thisHash) + { + ATH_MSG_FATAL("Previous SCT Module in eta (" << testHash << ") of next in eta (" << nextHash << ") is not the original (" << thisHash <<")" ); + return StatusCode::FAILURE; + } + nextEtaStat = helper->get_id(nextHash, nextId, &context); + if (nextEtaStat == 0) + { + nextEtaStation = helper->station(nextId); + nextEtaPlane = helper->layer(nextId); + nextEtaRow = helper->phi_module(nextId); + nextEtaModule = helper->eta_module(nextId); + nextEtaSensor = helper->side(nextId); + } + } + int flipStation { INVALID }; + int flipPlane { INVALID }; + int flipRow { INVALID }; + int flipModule { INVALID }; + int flipSensor { INVALID }; + int flipStat = helper->get_other_side(thisHash, flipHash); + if (flipStat == 0) + { + IdentifierHash testHash; + int flipStat = helper->get_other_side(flipHash, testHash); + if (flipStat != 0 || testHash != thisHash) + { + ATH_MSG_FATAL("Flip side of SCT sensor (" << testHash << ") of flip side (" << flipHash << ") is not the original (" << thisHash <<")" ); + return StatusCode::FAILURE; + } + flipStat = helper->get_id(flipHash, prevId, &context); + if (flipStat == 0) + { + flipStation = helper->station(prevId); + flipPlane = helper->layer(prevId); + flipRow = helper->phi_module(prevId); + flipModule = helper->eta_module(prevId); + flipSensor = helper->side(prevId); + } + } + else + { + ATH_MSG_FATAL("SCT sensor " << thisHash << " has no other side!"); + return StatusCode::FAILURE; + } + ATH_MSG_ALWAYS("Sct Sensor " << iStation << "/" << iPlane << "/" << iRow << "/" << iModule << "/" << iSensor << + " (" << thisHash << ") " << + ": prev phi = " << (prevPhiStation == INVALID ? "-" : std::to_string(prevPhiStation)) << "/" << + (prevPhiPlane == INVALID ? "-" : std::to_string(prevPhiPlane)) << "/" << + (prevPhiRow == INVALID ? "-": std::to_string(prevPhiRow)) << "/" << + (prevPhiModule == INVALID ? "-" : std::to_string(prevPhiModule)) << "/" << + (prevPhiSensor == INVALID ? "-" : std::to_string(prevPhiSensor)) << + " , next phi = " << (nextPhiStation == INVALID ? "-" : std::to_string(nextPhiStation)) << "/" << + (nextPhiPlane == INVALID ? "-" : std::to_string(nextPhiPlane)) << "/" << + (nextPhiRow == INVALID ? "-": std::to_string(nextPhiRow)) << "/" << + (nextPhiModule == INVALID ? "-" : std::to_string(nextPhiModule)) << "/" << + (nextPhiSensor == INVALID ? "-" : std::to_string(nextPhiSensor)) << + " , prev eta = " << (prevEtaStation == INVALID ? "-" : std::to_string(prevEtaStation)) << "/" << + (prevEtaPlane == INVALID ? "-" : std::to_string(prevEtaPlane)) << "/" << + (prevEtaRow == INVALID ? "-": std::to_string(prevEtaRow)) << "/" << + (prevEtaModule == INVALID ? "-" : std::to_string(prevEtaModule)) << "/" << + (prevEtaSensor == INVALID ? "-" : std::to_string(prevEtaSensor)) << + " , next eta = " << (nextEtaStation == INVALID ? "-" : std::to_string(nextEtaStation)) << "/" << + (nextEtaPlane == INVALID ? "-" : std::to_string(nextEtaPlane)) << "/" << + (nextEtaRow == INVALID ? "-": std::to_string(nextEtaRow)) << "/" << + (nextEtaModule == INVALID ? "-" : std::to_string(nextEtaModule)) << "/" << + (nextEtaSensor == INVALID ? "-" : std::to_string(nextEtaSensor)) << + " , other side = " << flipStation << "/" << + flipPlane << "/" << + flipRow << "/" << + flipModule << "/" << + flipSensor + ); + + } + } + } + } + } + } + else + { + ATH_MSG_FATAL("Failed to retrieve FaserSCT_ID helper from DetStore."); + return StatusCode::FAILURE; + } + + // Test direct retrieval of typed managers from DetStore + const TrackerDD::SCT_DetectorManager* sctMgr = nullptr; + ATH_CHECK(detStore()->retrieve(sctMgr, "SCT")); + if (sctMgr != nullptr) + { + ATH_MSG_ALWAYS("Retrieved (typed) SCT detector manager with " << sctMgr->getNumTreeTops() << " treetops directly from DetStore."); + // Compare numerology with the "right" answers from our properties + if (sctMgr->numerology().numStations() != m_numSctStations || sctMgr->getNumTreeTops() != m_numSctStations) + { + ATH_MSG_FATAL("Disagreement in number of SCT stations."); + return StatusCode::FAILURE; + } + if (sctMgr->numerology().numLayers() != m_numSctPlanesPerStation) + { + ATH_MSG_FATAL("Disagreement in number of layers per SCT station."); + return StatusCode::FAILURE; + } + if (sctMgr->numerology().numPhiModulesForLayer() != m_numSctRowsPerPlane) + { + ATH_MSG_FATAL("Disagreement in number of rows per SCT plane."); + return StatusCode::FAILURE; + } + if (sctMgr->numerology().numEtaModulesForLayer() != m_numSctModulesPerRow) + { + ATH_MSG_FATAL("Disagreement in number of modules per SCT row."); + return StatusCode::FAILURE; + } + if (sctMgr->numerology().maxNumStrips() != m_numSctStripsPerSensor) + { + ATH_MSG_FATAL("Disagreement in number of strips per SCT sensor."); + return StatusCode::FAILURE; + } + + // Test detector elements + const TrackerDD::SiDetectorElementCollection* elements = sctMgr->getDetectorElementCollection(); + for (int station = -m_numSctStations/2; station <= m_numSctStations/2; station++) + { + if (m_numSctStations%2 == 0 && station == 0) continue; + for (int plane = 0; plane < m_numSctPlanesPerStation; plane++) + { + for (int row = 0; row < m_numSctRowsPerPlane; row++) + { + for (int module = -m_numSctModulesPerRow/2; module <= m_numSctModulesPerRow/2; module++) + { + if (m_numSctModulesPerRow%2 == 0 && module == 0) continue; + for (int sensor = 0; sensor < 2; sensor++) + { + Identifier id = helper->wafer_id(station, plane, row, module, sensor, true); + if (!sctMgr->identifierBelongs(id)) + { + ATH_MSG_FATAL("Valid SCT sensor identifier does not pass identifierBelongs."); + return StatusCode::FAILURE; + } + IdentifierHash hash = helper->wafer_hash(id); + TrackerDD::SiDetectorElement* elementByLevels = sctMgr->getDetectorElement(station, plane, row, module, sensor); + TrackerDD::SiDetectorElement* elementById = sctMgr->getDetectorElement(id); + TrackerDD::SiDetectorElement* elementByHash = sctMgr->getDetectorElement(hash); + TrackerDD::SiDetectorElement* element = (*elements)[hash]; + if (elementByLevels != element || elementById != element || elementByHash != element) + { + ATH_MSG_FATAL("Inconsistent retrieval of SCT detector elements"); + return StatusCode::FAILURE; + } + ATH_MSG_ALWAYS("Found SCT sensor (" << station << "/" << plane << "/" << row << "/" << module << "/" << sensor << ") with global center at (" << + element->center().x() << ", " << + element->center().y() << ", " << + element->center().z() << ")." + ); + const TrackerDD::SiDetectorElement* nextPhi = element->nextInPhi(); + if (nextPhi != nullptr) + { + if (nextPhi->prevInPhi() != element) + { + ATH_MSG_FATAL("Previous phi neighbor of next SCT element is not this element."); + return StatusCode::FAILURE; + } + } + const TrackerDD::SiDetectorElement* prevPhi = element->prevInPhi(); + if (prevPhi != nullptr) + { + if (prevPhi->nextInPhi() != element) + { + ATH_MSG_FATAL("Next phi neighbor of previous SCT element is not this element."); + return StatusCode::FAILURE; + } + } + if (nextPhi == nullptr && prevPhi == nullptr) + { + ATH_MSG_FATAL("SCT element " << hash << " has no previous OR next phi neighbor."); + return StatusCode::FAILURE; + } + const TrackerDD::SiDetectorElement* nextEta = element->nextInEta(); + if (nextEta != nullptr) + { + if (nextEta->prevInEta() != element) + { + ATH_MSG_FATAL("Previous eta neighbor of next SCT element is not this element."); + return StatusCode::FAILURE; + } + } + const TrackerDD::SiDetectorElement* prevEta = element->prevInEta(); + if (prevEta != nullptr) + { + if (prevEta->nextInEta() != element) + { + ATH_MSG_FATAL("Next eta neighbor of previous SCT element is not this element."); + return StatusCode::FAILURE; + } + } + if (nextEta == nullptr && prevEta == nullptr) + { + ATH_MSG_FATAL("SCT element " << hash << " has no previous OR next eta neighbor."); + return StatusCode::FAILURE; + } + const TrackerDD::SiDetectorElement* flip = element->otherSide(); + if (flip == nullptr) + { + ATH_MSG_FATAL("SCT element " << hash << " has no other side."); + return StatusCode::FAILURE; + } + if (flip->otherSide() != element) + { + ATH_MSG_FATAL("Other side of other side of SCT sensor is not this sensor."); + return StatusCode::FAILURE; + } + } + } + } + } + } + } + else + { + ATH_MSG_FATAL("Failed to retrieve (typed) SCT detector manager directly from DetStore."); + return StatusCode::FAILURE; + } return StatusCode::SUCCESS; } @@ -64,9 +412,9 @@ StatusCode GeoModelTestAlg::testVeto() // Test neighbors with helper function const IdContext& context = helper->plate_context(); ATH_MSG_ALWAYS("Retrieved VetoID helper from DetStore."); - for (int iStation = 0; iStation < 2; iStation++) + for (int iStation = 0; iStation < m_numVetoStations; iStation++) { - for (int iPlate = 0; iPlate < 2; iPlate++) + for (int iPlate = 0; iPlate < m_numVetoPlatesPerStation; iPlate++) { Identifier thisId = helper->plate_id(iStation, iPlate, true); IdentifierHash thisHash = helper->plate_hash(thisId); @@ -85,7 +433,7 @@ StatusCode GeoModelTestAlg::testVeto() int nextStat = helper->get_next_in_z(prevHash, testHash); if (nextStat != 0 || testHash != thisHash) { - ATH_MSG_FATAL("Next (" << testHash << ") of previous (" << prevHash << ") is not the original (" << thisHash <<")" ); + ATH_MSG_FATAL("Next Veto plate (" << testHash << ") of previous (" << prevHash << ") is not the original (" << thisHash <<")" ); return StatusCode::FAILURE; } prevStat = helper->get_id(prevHash, prevId, &context); @@ -102,7 +450,7 @@ StatusCode GeoModelTestAlg::testVeto() prevStat = helper->get_prev_in_z(nextHash, testHash); if (prevStat != 0 || testHash != thisHash) { - ATH_MSG_FATAL("Previous (" << testHash << ") of next (" << nextHash << ") is not the original (" << thisHash <<")" ); + ATH_MSG_FATAL("Previous veto plate (" << testHash << ") of next (" << nextHash << ") is not the original (" << thisHash <<")" ); return StatusCode::FAILURE; } nextStat = helper->get_id(nextHash, nextId, &context); diff --git a/DetectorDescription/GeoModel/GeoModelTest/src/GeoModelTestAlg.h b/DetectorDescription/GeoModel/GeoModelTest/src/GeoModelTestAlg.h index f70dd6fb837b1649a4eeab465e9505cf0b186654..c1a3a56841183663d11252ef229ca374f9540586 100644 --- a/DetectorDescription/GeoModel/GeoModelTest/src/GeoModelTestAlg.h +++ b/DetectorDescription/GeoModel/GeoModelTest/src/GeoModelTestAlg.h @@ -15,9 +15,16 @@ class GeoModelTestAlg : public AthAlgorithm private: StatusCode testVeto(); + StatusCode testSCT(); // Independently specify the "right" number of elements, for comparison with what we get from detector store Gaudi::Property<int> m_numVetoStations {this, "NumVetoStations", 2, "Number of stations in the Veto detector"}; Gaudi::Property<int> m_numVetoPlatesPerStation {this, "NumVetoPlatesPerStation", 2, "Number of plates per station in the Veto detector"}; Gaudi::Property<int> m_numVetoPmtsPerPlate {this, "NumVetoPmtsPerPlate", 1, "Number of pmts per plate in the Veto detector"}; + + Gaudi::Property<int> m_numSctStations {this, "NumSCTStations", 3, "Number of stations in the SCT detector"}; + Gaudi::Property<int> m_numSctPlanesPerStation {this, "NumSCTPlanesPerStation", 3, "Number of planes per station in the SCT detector"}; + Gaudi::Property<int> m_numSctRowsPerPlane {this, "NumSCTRowsPerPlane", 4, "Number of rows of modules per plane in the SCT detector"}; + Gaudi::Property<int> m_numSctModulesPerRow {this, "NumSCTModulesPerRow", 2, "Number of modules per row in the SCT detector"}; + Gaudi::Property<int> m_numSctStripsPerSensor {this, "NumSCTStripsPerSensor", 768,"Number of readout strips per sensor in the SCT detector"}; }; \ No newline at end of file diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.h index eaa3dbba0343a04082eb48e8243120d22a783862..90ee8ca9ec8767b5c7f928b4d7c46f1848de0f0a 100755 --- a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.h +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.h @@ -36,27 +36,41 @@ namespace TrackerDD { /** Number of barrels. Normally 3. */ int numBarrels() const; + + int numStations() const; // /** Barrel/endcap identifier for each barrel. Normally barrelId(0) = -1 */ int barrelId(int index) const; + + int stationId(int index) const; /** Number of layers */ int numLayers() const; /** Number of sectors in phi for a layer */ int numPhiModulesForLayer(int layer) const; + + int numPhiModulesForLayer() const; /** Number of sectors in phi for a ring in a disk */ int numEtaModulesForLayer(int layer) const; + int numEtaModulesForLayer() const; + /** First eta_module number for a layer */ int beginEtaModuleForLayer(int layer) const; + int beginEtaModuleForLayer() const; + /** Last eta_module number + 1 */ int endEtaModuleForLayer(int layer) const; + int endEtaModuleForLayer() const; + /** Check if eta_module=0 exists */ bool skipEtaZeroForLayer(int layer) const; + + bool skipEtaZeroForLayer() const; // Check presence of layer/disk /** Check if layer exists */ diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.icc b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.icc index 360d98650b8cc6a0ac8ffd5683cb8450da7b8492..fe2c2ba5cb21c7d3e8f70e4bf07270f69d8c123a 100644 --- a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.icc +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.icc @@ -9,11 +9,21 @@ inline int SiNumerology::numBarrels() const return m_barrelIds.size(); } +inline int SiNumerology::numStations() const +{ + return m_barrelIds.size(); +} + inline int SiNumerology::barrelId(int index) const { return m_barrelIds[index]; } +inline int SiNumerology::stationId(int index) const +{ + return m_barrelIds[index]; +} + inline int SiNumerology::numLayers() const { return m_numLayers; @@ -24,22 +34,42 @@ inline int SiNumerology::numPhiModulesForLayer(int layer) const return m_phiModulesForLayer[layer]; } +inline int SiNumerology::numPhiModulesForLayer() const +{ + return m_maxNumBarrelPhiModules; +} + inline int SiNumerology::numEtaModulesForLayer(int layer) const { return m_etaModulesForLayer[layer]; } +inline int SiNumerology::numEtaModulesForLayer() const +{ + return m_maxNumBarrelEta; +} + inline int SiNumerology::beginEtaModuleForLayer(int layer) const { // Assume symmetric about zero. return -m_etaModulesForLayer[layer]/2; } +inline int SiNumerology::beginEtaModuleForLayer() const +{ + return -m_maxNumBarrelEta/2; +} +// these are both 1 past the end, like an iterator ::end() inline int SiNumerology::endEtaModuleForLayer(int layer) const { // Assume symmetric about zero. return m_etaModulesForLayer[layer]/2+1; } + +inline int SiNumerology::endEtaModuleForLayer() const +{ + return m_maxNumBarrelEta/2 + 1; +} inline bool SiNumerology::skipEtaZeroForLayer(int layer) const { @@ -47,6 +77,11 @@ inline bool SiNumerology::skipEtaZeroForLayer(int layer) const return !(m_etaModulesForLayer[layer]%2); } +inline bool SiNumerology::skipEtaZeroForLayer() const +{ + return !(m_maxNumBarrelEta%2); +} + inline int SiNumerology::maxNumBarrelEta() const { return m_maxNumBarrelEta;