diff --git a/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_ReadCalibDataTool.cxx b/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_ReadCalibDataTool.cxx index 2d96d7161891778d7c68c489f39385f57be76144..acdbeada758d94ea5eae3d2c6fb725204eb8e38f 100644 --- a/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_ReadCalibDataTool.cxx +++ b/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_ReadCalibDataTool.cxx @@ -54,9 +54,25 @@ bool SCT_ReadCalibDataTool::canReportAbout(InDetConditions::Hierarchy h) const { bool SCT_ReadCalibDataTool::isGood(const Identifier& elementId, const EventContext& ctx, InDetConditions::Hierarchy h) const { // Status of the compId bool status{true}; - // Extract the moduleId from the comp identifier - Identifier moduleId{m_id_sct->module_id(elementId)}; switch (h) { + case InDetConditions::SCT_STRIP: + { + // Retrieve isGood Wafer data + const SCT_AllGoodStripInfo* condDataInfo{getCondDataInfo(ctx)}; + if (condDataInfo==nullptr) { + ATH_MSG_ERROR("In isGood, SCT_AllGoodStripInfo cannot be retrieved"); + return false; + } + // Extract the wafer identifier from the strip identifier + Identifier waferId{m_id_sct->wafer_id(elementId)}; + // Get hashId + IdentifierHash waferHash{m_id_sct->wafer_hash(waferId)}; + // Get strip on wafer to check + int strip{m_id_sct->strip(elementId)}; + // Set value + status = (*condDataInfo)[waferHash.value()][strip]; + break; + } case InDetConditions::SCT_MODULE: { // Not applicable for Calibration data @@ -75,30 +91,8 @@ bool SCT_ReadCalibDataTool::isGood(const Identifier& elementId, const EventConte ATH_MSG_WARNING("summary(): Chip good/bad is not applicable for Calibration data"); break; } - case InDetConditions::SCT_STRIP: - { - // Get hashId - IdentifierHash hashIdx{m_id_sct->wafer_hash(moduleId)}; - int side{m_id_sct->side(elementId)}; - if (side==1) m_id_sct->get_other_side(hashIdx, hashIdx); - unsigned int waferIdx{hashIdx}; - //unsigned int waferIdx=hashIdx+side; //uhm - // Get strip on wafer to check - int strip{m_id_sct->strip(elementId)}; - // Retrieve isGood Wafer data - - const SCT_AllGoodStripInfo* condDataInfo{getCondDataInfo(ctx)}; - if (condDataInfo==nullptr) { - ATH_MSG_ERROR("In isGood, SCT_AllGoodStripInfo cannot be retrieved"); - return false; - } - // Set value - status = (*condDataInfo)[waferIdx][strip]; - break; - } default: { - status = true ; ATH_MSG_INFO("Unknown component has been asked for, should be Module/Wafer/Chip or Strip; returning 'good' and continuing"); } } //end of switch structure diff --git a/InnerDetector/InDetRecTools/InDetTrackHoleSearch/InDetTrackHoleSearch/InDetTrackHoleSearchTool.h b/InnerDetector/InDetRecTools/InDetTrackHoleSearch/InDetTrackHoleSearch/InDetTrackHoleSearchTool.h index 0c5705d7b3a266d586a14f32e9f1e30cc41a7eda..11a0d9e691eef026d886239d015651b08271d426 100644 --- a/InnerDetector/InDetRecTools/InDetTrackHoleSearch/InDetTrackHoleSearch/InDetTrackHoleSearchTool.h +++ b/InnerDetector/InDetRecTools/InDetTrackHoleSearch/InDetTrackHoleSearch/InDetTrackHoleSearchTool.h @@ -180,8 +180,8 @@ namespace InDet const Trk::Track* addHolesToTrack(const Trk::Track& oldTrack, std::vector<const Trk::TrackStateOnSurface*>* listOfHoles) const; - /** This method checks the SCT ABCD chip where the track passes through is bad or not */ - bool isBadSCTChip(const Identifier& waferId, const Trk::TrackParameters& parameters, const InDetDD::SiDetectorElement& siElement) const; + /** This method checks the SCT ABCD chip and SCT strip where the track passes through is bad or not */ + bool isBadSCTChipStrip(const Identifier& waferId, const Trk::TrackParameters& parameters, const InDetDD::SiDetectorElement& siElement) const; }; } // end of namespace diff --git a/InnerDetector/InDetRecTools/InDetTrackHoleSearch/src/InDetTrackHoleSearchTool.cxx b/InnerDetector/InDetRecTools/InDetTrackHoleSearch/src/InDetTrackHoleSearchTool.cxx index 294d9d5772d52d8901a868aca3f989f8513aecbd..20fb0e6b5ea165bb499fe90841b4a82bdc6c97a2 100644 --- a/InnerDetector/InDetRecTools/InDetTrackHoleSearch/src/InDetTrackHoleSearchTool.cxx +++ b/InnerDetector/InDetRecTools/InDetTrackHoleSearch/src/InDetTrackHoleSearchTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /////////////////////////////////////////////////////////////////// @@ -93,7 +93,7 @@ StatusCode InDet::InDetTrackHoleSearchTool::initialize() { } if (m_checkBadSCTChip) { - // Check if ITk Strip is used because isBadSCTChip method is valid only for SCT. + // Check if ITk Strip is used because isBadSCTChipStrip method is valid only for SCT. ATH_CHECK(m_geoModelSvc.retrieve()); if (m_geoModelSvc->geoConfig()==GeoModel::GEO_RUN4 or m_geoModelSvc->geoConfig()==GeoModel::GEO_ITk) { @@ -845,7 +845,7 @@ bool InDet::InDetTrackHoleSearchTool::isSensitive(const Trk::TrackParameters* pa // the track plus its error hits the active material if (isActiveElement) { - if (m_checkBadSCTChip and isBadSCTChip(id, *parameters, *siElement)) { + if (m_checkBadSCTChip and isBadSCTChipStrip(id, *parameters, *siElement)) { ATH_MSG_VERBOSE("Track is hiting a bad SCT chip, this is not a hole candidate!"); isgood = false; return false; @@ -938,27 +938,31 @@ const Trk::Track* InDet::InDetTrackHoleSearchTool::addHolesToTrack(const Trk::T } // ==================================================================================================================== -bool InDet::InDetTrackHoleSearchTool::isBadSCTChip(const Identifier& waferId, - const Trk::TrackParameters& parameters, - const InDetDD::SiDetectorElement& siElement) const { - // Check if the track passes through a bad SCT ABCD chip - // A chip is determined by the extrapolated position. +bool InDet::InDetTrackHoleSearchTool::isBadSCTChipStrip(const Identifier& waferId, + const Trk::TrackParameters& parameters, + const InDetDD::SiDetectorElement& siElement) const { + // Check if the track passes through a bad SCT ABCD chip or a bad SCT strip. + // A chip and a strip are determined by the extrapolated position. // Algorithm is based on InnerDetector/InDetMonitoring/SCT_Monitoring/src/SCTHitEffMonTool.cxx - // Check the input + // Check the input. if (not m_atlasId->is_sct(waferId)) { ATH_MSG_WARNING(waferId << " is not an SCT Identifier"); return true; } - // There is at least one bad chip on the side. - // Get strip id from local position + // Get strip id from local position. + // Due to the limited position resolution, we may pick up a neighboring strip... const Amg::Vector2D localPos(parameters.localPosition()); const Identifier stripIdentifier(siElement.identifierOfPosition(localPos)); if (not m_atlasId->is_sct(stripIdentifier)) { ATH_MSG_WARNING(stripIdentifier << " is not an SCT Identifier"); return true; } - - return (not m_sctCondSummaryTool->isGood(stripIdentifier, InDetConditions::SCT_CHIP)); + + // The extrapolated position is on a bad chip. + if (not m_sctCondSummaryTool->isGood(stripIdentifier, InDetConditions::SCT_CHIP)) return true; + // The extrapolated position is on a bad strip. (We may need to check neighboring strips.) + if (not m_sctCondSummaryTool->isGood(stripIdentifier, InDetConditions::SCT_STRIP)) return true; + return false; }