ATLAS Offline Software
Loading...
Searching...
No Matches
ActsTrk::StripClusteringTool Class Reference

#include <StripClusteringTool.h>

Inheritance diagram for ActsTrk::StripClusteringTool:
Collaboration diagram for ActsTrk::StripClusteringTool:

Public Types

using StripRDORawData = SCT_RDORawData
using StripID = SCT_ID

Public Member Functions

 StripClusteringTool (const std::string &type, const std::string &name, const IInterface *parent)
virtual StatusCode initialize () override
virtual StatusCode clusterize (const EventContext &ctx, const InDetRawDataCollection< StripRDORawData > &RDOs, const InDet::SiDetectorElementStatus &stripDetElStatus, const InDetDD::SiDetectorElement &element, Acts::Ccl::ClusteringData &data, std::vector< typename IStripClusteringTool::ClusterCollection > &collection) const override
virtual StatusCode makeClusters (const EventContext &ctx, typename IStripClusteringTool::ClusterCollection &cluster, const InDetDD::SiDetectorElement &element, typename ClusterContainer::iterator itrContainer) const override

Private Member Functions

std::optional< std::pair< typename IStripClusteringTool::CellCollection, bool > > unpackRDOs (const EventContext &ctx, const RawDataCollection &RDOs, const InDet::SiDetectorElementStatus &stripDetElStatus, const InDetDD::SiDetectorElement &element) const
bool passTiming (const std::bitset< 3 > &timePattern) const
StatusCode decodeTimeBins ()
bool isBadStrip (const EventContext &ctx, const InDet::SiDetectorElementStatus *sctDetElStatus, const StripID &idHelper, IdentifierHash waferHash, Identifier stripId) const
StatusCode makeCluster (StripClusteringTool::Cluster &cluster, double LorentzShift, Eigen::Matrix< float, 1, 1 > &localCov, const StripID &stripID, const InDetDD::SiDetectorElement &element, const InDetDD::SiDetectorDesign &design, xAOD::StripCluster &container) const

Private Attributes

StringProperty m_timeBinStr {this, "timeBins", ""}
ToolHandle< ISiLorentzAngleToolm_lorentzAngleTool
SG::ReadHandleKey< InDet::SiDetectorElementStatusm_stripDetElStatus
ToolHandle< IInDetConditionsToolm_conditionsTool
Gaudi::Property< bool > m_checkBadModules
Gaudi::Property< unsigned int > m_maxFiredStrips
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollectionm_stripDetEleCollKey
Gaudi::Property< bool > m_isITk
Gaudi::Property< unsigned int > m_errorStrategy {this, "errorStrategy", 0, "Use different error strategies for the strip clusters"}
int m_timeBinBits [3] {-1, -1, -1}
const StripIDm_stripID {nullptr}

Detailed Description

Definition at line 26 of file StripClusteringTool.h.

Member Typedef Documentation

◆ StripID

◆ StripRDORawData

Constructor & Destructor Documentation

◆ StripClusteringTool()

ActsTrk::StripClusteringTool::StripClusteringTool ( const std::string & type,
const std::string & name,
const IInterface * parent )

Definition at line 48 of file StripClusteringTool.cxx.

50 : base_class(type,name,parent)
51{
52}

Member Function Documentation

◆ clusterize()

StatusCode ActsTrk::StripClusteringTool::clusterize ( const EventContext & ctx,
const InDetRawDataCollection< StripRDORawData > & RDOs,
const InDet::SiDetectorElementStatus & stripDetElStatus,
const InDetDD::SiDetectorElement & element,
Acts::Ccl::ClusteringData & data,
std::vector< typename IStripClusteringTool::ClusterCollection > & collection ) const
overridevirtual

Definition at line 98 of file StripClusteringTool.cxx.

104{
105 IdentifierHash idHash = RDOs.identifyHash();
106 // At least an empty cluster collection needs to be always added because the
107 // assumption is that there is one element per element RawDataCollection.
108 collection.emplace_back();
109 bool goodModule = true;
110 if (m_checkBadModules.value()) {
111 goodModule = stripDetElStatus.isGood(idHash);
112 }
113
115 m_checkBadModules.value() && !m_stripDetElStatus.empty(),
116 stripDetElStatus.isGood(idHash), m_conditionsTool->isGood(idHash));
117
118 if (!goodModule) {
119 ATH_MSG_DEBUG("Strip module failed status check");
120 return StatusCode::SUCCESS;
121 }
122
123 // If more than a certain number of RDOs set module to bad
124 // in this case we skip clusterization
125 if (m_maxFiredStrips != 0u) {
126 unsigned int nFiredStrips = 0u;
127 for (const SCT_RDORawData* rdo : RDOs) {
128 nFiredStrips += rdo->getGroupSize();
129 }
130 if (nFiredStrips > m_maxFiredStrips)
131 return StatusCode::SUCCESS;
132 }
133
134 std::optional<std::pair<typename IStripClusteringTool::CellCollection,bool>> unpckd
135 = unpackRDOs(ctx, RDOs, stripDetElStatus, element);
136
137 if (not unpckd.has_value()) {
138 ATH_MSG_FATAL("Error encountered while unpacking strip RDOs!");
139 return StatusCode::FAILURE;
140 }
141
142 auto& [cells, badStripOnModule] = *unpckd;
143 // Bad strips on a module invalidates the hitsInThirdTimeBin word.
144 // Therefore set it to 0 if that's the case.
145 // We are currently not using this, but keeping it here should we need it in the future
146
147 Acts::Ccl::createClusters<CellCollection, typename IStripClusteringTool::ClusterCollection, 1>(data, cells, collection.back());
148
149 return StatusCode::SUCCESS;
150}
#define ATH_MSG_FATAL(x)
#define ATH_MSG_DEBUG(x)
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
#define VALIDATE_STATUS_ARRAY(use_info, info_val, summary_val)
ToolHandle< IInDetConditionsTool > m_conditionsTool
Gaudi::Property< unsigned int > m_maxFiredStrips
Gaudi::Property< bool > m_checkBadModules
SG::ReadHandleKey< InDet::SiDetectorElementStatus > m_stripDetElStatus
std::optional< std::pair< typename IStripClusteringTool::CellCollection, bool > > unpackRDOs(const EventContext &ctx, const RawDataCollection &RDOs, const InDet::SiDetectorElementStatus &stripDetElStatus, const InDetDD::SiDetectorElement &element) const
virtual IdentifierHash identifyHash() const override final
bool isGood(IdentifierHash hash) const
@ u
Enums for curvilinear frames.
Definition ParamDefs.h:77

◆ decodeTimeBins()

StatusCode ActsTrk::StripClusteringTool::decodeTimeBins ( )
private

Definition at line 78 of file StripClusteringTool.cxx.

79{
80 for (size_t i = 0; i < m_timeBinStr.size(); i++) {
81 if (i >= 3) {
82 ATH_MSG_WARNING("Time bin string has excess characters");
83 break;
84 }
85 switch (std::toupper(m_timeBinStr[i])) {
86 case 'X': m_timeBinBits[i] = -1; break;
87 case '0': m_timeBinBits[i] = 0; break;
88 case '1': m_timeBinBits[i] = 1; break;
89 default:
90 ATH_MSG_FATAL("Invalid time bin string: " << m_timeBinStr);
91 return StatusCode::FAILURE;
92 }
93 }
94 return StatusCode::SUCCESS;
95}
#define ATH_MSG_WARNING(x)

◆ initialize()

StatusCode ActsTrk::StripClusteringTool::initialize ( )
overridevirtual

Definition at line 54 of file StripClusteringTool.cxx.

55{
56 ATH_MSG_DEBUG("Initializing " << name() << "...");
57
64
65
66 ATH_CHECK(m_conditionsTool.retrieve(DisableTool{!m_stripDetElStatus.empty()} ));
67 ATH_CHECK(m_lorentzAngleTool.retrieve());
69
70 ATH_CHECK(m_stripDetElStatus.initialize(not m_stripDetElStatus.empty()));
71 ATH_CHECK(m_stripDetEleCollKey.initialize());
72
73 ATH_CHECK( detStore()->retrieve(m_stripID, "SCT_ID") );
74
75 return StatusCode::SUCCESS;
76}
#define ATH_CHECK
Evaluate an expression and check for errors.
Gaudi::Property< bool > m_isITk
ToolHandle< ISiLorentzAngleTool > m_lorentzAngleTool
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_stripDetEleCollKey
Gaudi::Property< unsigned int > m_errorStrategy
retrieve(aClass, aKey=None)
Definition PyKernel.py:110

◆ isBadStrip()

bool ActsTrk::StripClusteringTool::isBadStrip ( const EventContext & ctx,
const InDet::SiDetectorElementStatus * sctDetElStatus,
const StripID & idHelper,
IdentifierHash waferHash,
Identifier stripId ) const
private

Definition at line 300 of file StripClusteringTool.cxx.

305{
306 if (stripDetElStatus) {
307 const int strip_i{stripID.strip(stripId)};
309 stripDetElStatus,
310 stripDetElStatus->isCellGood(waferHash.value(), strip_i),
312 return not stripDetElStatus->isCellGood(waferHash.value(), strip_i) ;
313 }
314 return not m_conditionsTool->isGood(stripId, InDetConditions::SCT_STRIP, ctx);
315}
value_type value() const

◆ makeCluster()

StatusCode ActsTrk::StripClusteringTool::makeCluster ( StripClusteringTool::Cluster & cluster,
double LorentzShift,
Eigen::Matrix< float, 1, 1 > & localCov,
const StripID & stripID,
const InDetDD::SiDetectorElement & element,
const InDetDD::SiDetectorDesign & design,
xAOD::StripCluster & container ) const
private

Definition at line 239 of file StripClusteringTool.cxx.

246{
247 std::size_t size = cluster.ids.size();
248
249 auto [localPos, globalPos]
250 = computePosition(cluster, size, lorentzShift, stripID, element, design, m_isITk);
251
252 // For Strip Clusters the identifier is taken from the front rod list object
253 // This is the same strategy used in Athena:
254 // Since clusterId is arbitary (it only needs to be unique) just use ID of first strip
255 // For strip Cluster it has been found that "identifierOfPosition" does not produces unique values
256
257
258 // If requiring broad errors, use the cluster size as error -
259 // TODO use SiWidth to get the right cluster size as I'm assuming equal strip pitch
260
261 if (m_errorStrategy == 1) {// use width
262
263 localCov *= size*size;
264
265 } else if (m_errorStrategy == 2) { //use tuned error as function of size
266
267 if (size == 1)
268 localCov *= oneStripSF;
269 else if (size == 2)
270 localCov *= twoStripSF*size*size;
271 else
272 localCov *= size*size;
273
274 }
275
276 cl.setMeasurement<1>(element.identifyHash(), localPos, localCov);
277 cl.setIdentifier( cluster.ids.front() );
278
279 // Do I really need the global position in fast tracking?
280 cl.globalPosition() = globalPos;
281
282 cl.setChannelsInPhi(size);
283 cl.setRDOlist(std::move(cluster.ids));
284
285 return StatusCode::SUCCESS;
286}
virtual IdentifierHash identifyHash() const override final
identifier hash (inline)
constexpr float oneStripSF
static std::pair< Eigen::Matrix< float, 1, 1 >, Eigen::Matrix< float, 3, 1 > > computePosition(const StripClusteringTool::Cluster &cluster, std::size_t size, double lorentzShift, const IStripClusteringTool::IDHelper &stripID, const InDetDD::SiDetectorElement &element, const InDetDD::SiDetectorDesign &design, bool isITk)
constexpr float twoStripSF
cl
print [x.__class__ for x in toList(dqregion.getSubRegions()) ]

◆ makeClusters()

StatusCode ActsTrk::StripClusteringTool::makeClusters ( const EventContext & ctx,
typename IStripClusteringTool::ClusterCollection & cluster,
const InDetDD::SiDetectorElement & element,
typename ClusterContainer::iterator itrContainer ) const
overridevirtual

Definition at line 154 of file StripClusteringTool.cxx.

158{
159 const IdentifierHash idHash = element.identifyHash();
160 double lorentzShift = m_lorentzAngleTool->getLorentzShift(idHash, ctx);
161
162 const InDetDD::SiDetectorDesign& design = element.design();
163 // get the pitch, this will be the local covariance for the cluster
164
165 assert((not m_isITk) || element.isBarrel() || dynamic_cast<const InDetDD::StripStereoAnnulusDesign*>(&element.design()) !=nullptr);
166 float pitch = (element.isBarrel() or (not m_isITk))
167 ? design.phiPitch()
168 : static_cast<const InDetDD::StripStereoAnnulusDesign&>(element.design()).phiPitchPhi();
169 Eigen::Matrix<float,1,1> localCov(pitch * pitch * ONE_TWELFTH);
170
171 for (typename IStripClusteringTool::Cluster& cl : clusters) {
172 try {
173 xAOD::StripCluster *xaodCluster = *itrContainer;
175 lorentzShift,
176 localCov,
177 *m_stripID,
178 element,
179 design,
180 *xaodCluster));
181 ++itrContainer;
182 } catch (const std::exception& e) {
183 ATH_MSG_FATAL("Exception thrown while creating xAOD::StripCluster:"
184 << e.what());
185 ATH_MSG_FATAL("Detector Element identifier: " << element.identify());
186 ATH_MSG_FATAL("Strip Identifiers in cluster:");
187 for (const auto& id : cl.ids)
188 ATH_MSG_FATAL(" " << id);
189 return StatusCode::FAILURE;
190 }
191 }
192
193 return StatusCode::SUCCESS;
194}
StatusCode makeCluster(StripClusteringTool::Cluster &cluster, double LorentzShift, Eigen::Matrix< float, 1, 1 > &localCov, const StripID &stripID, const InDetDD::SiDetectorElement &element, const InDetDD::SiDetectorDesign &design, xAOD::StripCluster &container) const
virtual double phiPitch() const =0
Pitch in phi direction.
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
virtual Identifier identify() const override final
identifier of this detector element (inline)
constexpr double ONE_TWELFTH
StripCluster_v1 StripCluster
Define the version of the strip cluster class.

◆ passTiming()

bool ActsTrk::StripClusteringTool::passTiming ( const std::bitset< 3 > & timePattern) const
private

Definition at line 289 of file StripClusteringTool.cxx.

289 {
290 // Convert the given timebin to a bit set and test each bit
291 // if bit is -1 (i.e. X) it always passes, other wise require exact match of 0/1
292 // N.B bitset has opposite order to the bit pattern we define
293 if (m_timeBinBits[0] != -1 and timePattern.test(2) != static_cast<bool>(m_timeBinBits[0])) return false;
294 if (m_timeBinBits[1] != -1 and timePattern.test(1) != static_cast<bool>(m_timeBinBits[1])) return false;
295 if (m_timeBinBits[2] != -1 and timePattern.test(0) != static_cast<bool>(m_timeBinBits[2])) return false;
296 return true;
297}

◆ unpackRDOs()

std::optional< std::pair< typename IStripClusteringTool::CellCollection, bool > > ActsTrk::StripClusteringTool::unpackRDOs ( const EventContext & ctx,
const RawDataCollection & RDOs,
const InDet::SiDetectorElementStatus & stripDetElStatus,
const InDetDD::SiDetectorElement & element ) const
private

Definition at line 319 of file StripClusteringTool.cxx.

323{
324 const InDetDD::SiDetectorDesign& design = element.design();
325
326 CellCollection cells;
327 // reserve memory. number evaluated on ttbar pu200
328 cells.reserve(60);
329 bool badStripOnModule{false};
330 //Check type in debug build otherwise assume it is correct
331 assert(dynamic_cast<const InDetDD::SCT_ModuleSideDesign*>(&design)!=nullptr);
332 std::size_t ncells = static_cast<size_t>(static_cast<const InDetDD::SCT_ModuleSideDesign&>(design).cells());
333
334 // Simple single-entry cache
335 Identifier::value_type waferId_compact_cache = 0;
336 IdentifierHash waferHash_cache(0);
337 bool cache_valid = false;
338
339 for (const StripRDORawData * raw : RDOs) {
340
341 //Check type in debug build otherwise assume it is correct
342 assert(static_cast<const SCT3_RawData*>(raw)!=nullptr);
343 const SCT3_RawData* raw3 = static_cast<const SCT3_RawData*>(raw);
344
345 std::bitset<3> timePattern(raw3->getTimeBin());
346 if (!passTiming(timePattern)) {
347 ATH_MSG_DEBUG("Strip failed timing check");
348 continue;
349 }
350
351 Identifier firstStripId = raw->identify();
352 Identifier waferId = m_stripID->wafer_id(firstStripId);
353
354 Identifier::value_type waferId_compact = waferId.get_compact();
355
356
357 // Check cache - will be invalid when switching wafer groups
358 if (!cache_valid || waferId_compact != waferId_compact_cache) {
359 waferId_compact_cache = waferId_compact;
360 waferHash_cache = m_stripID->wafer_hash(waferId);
361 cache_valid = true;
362 }
363
364 std::size_t iFirstStrip = static_cast<size_t>(m_stripID->strip(firstStripId));
365
366 std::size_t iMaxStrip = std::min(
367 iFirstStrip + raw->getGroupSize(),
368 ncells
369 );
370
371 for (size_t i = iFirstStrip; i < iMaxStrip; i++) {
372 Identifier stripIdent = m_stripID->strip_id(waferId, i);
373 if (isBadStrip(ctx, &stripDetElStatus, *m_stripID, waferHash_cache, stripIdent)) {
374 // Bad strip, throw it out to minimize useless work.
375 ATH_MSG_DEBUG("Bad strip encountered:" << stripIdent
376 << ", wafer is: " << waferId);
377 badStripOnModule = true;
378 } else {
379 // Good strip!
380 cells.emplace_back(i, stripIdent, std::move(timePattern));
381 }
382 }
383 }
384
385 return std::make_pair(std::move(cells), badStripOnModule);
386}
bool passTiming(const std::bitset< 3 > &timePattern) const
bool isBadStrip(const EventContext &ctx, const InDet::SiDetectorElementStatus *sctDetElStatus, const StripID &idHelper, IdentifierHash waferHash, Identifier stripId) const
value_type get_compact() const
Get the compact id.
int getTimeBin() const

Member Data Documentation

◆ m_checkBadModules

Gaudi::Property<bool> ActsTrk::StripClusteringTool::m_checkBadModules
private
Initial value:
{this, "checkBadModules", true,
"Check bad modules using the conditions summary tool"}

Definition at line 90 of file StripClusteringTool.h.

90 {this, "checkBadModules", true,
91 "Check bad modules using the conditions summary tool"};

◆ m_conditionsTool

ToolHandle<IInDetConditionsTool> ActsTrk::StripClusteringTool::m_conditionsTool
private
Initial value:
{this, "conditionsTool", "",
"Conditions summary tool"}

Definition at line 87 of file StripClusteringTool.h.

87 {this, "conditionsTool", "",
88 "Conditions summary tool"};

◆ m_errorStrategy

Gaudi::Property<unsigned int> ActsTrk::StripClusteringTool::m_errorStrategy {this, "errorStrategy", 0, "Use different error strategies for the strip clusters"}
private

Definition at line 102 of file StripClusteringTool.h.

102{this, "errorStrategy", 0, "Use different error strategies for the strip clusters"};

◆ m_isITk

Gaudi::Property<bool> ActsTrk::StripClusteringTool::m_isITk
private
Initial value:
{this, "isITk", true,
"True if running in ITk"}

Definition at line 99 of file StripClusteringTool.h.

99 {this, "isITk", true,
100 "True if running in ITk"};

◆ m_lorentzAngleTool

ToolHandle<ISiLorentzAngleTool> ActsTrk::StripClusteringTool::m_lorentzAngleTool
private
Initial value:
{this, "LorentzAngleTool", "",
"Tool to retreive Lorentz angle of Si detector module"
}

Definition at line 79 of file StripClusteringTool.h.

79 {this, "LorentzAngleTool", "",
80 "Tool to retreive Lorentz angle of Si detector module"
81 };

◆ m_maxFiredStrips

Gaudi::Property<unsigned int> ActsTrk::StripClusteringTool::m_maxFiredStrips
private
Initial value:
{this, "maxFiredStrips", 384u,
"Threshold of number of fired strips per wafer. 0 disables the per-wafer cut."}

Definition at line 93 of file StripClusteringTool.h.

93 {this, "maxFiredStrips", 384u,
94 "Threshold of number of fired strips per wafer. 0 disables the per-wafer cut."};

◆ m_stripDetEleCollKey

SG::ReadCondHandleKey<InDetDD::SiDetectorElementCollection> ActsTrk::StripClusteringTool::m_stripDetEleCollKey
private
Initial value:
{this, "StripDetEleCollKey", "ITkStripDetectorElementCollection",
"SiDetectorElementCollection key for strip"}

Definition at line 96 of file StripClusteringTool.h.

96 {this, "StripDetEleCollKey", "ITkStripDetectorElementCollection",
97 "SiDetectorElementCollection key for strip"};

◆ m_stripDetElStatus

SG::ReadHandleKey<InDet::SiDetectorElementStatus> ActsTrk::StripClusteringTool::m_stripDetElStatus
private
Initial value:
{this, "StripDetElStatus", "",
"SiDetectorElementStatus for strip"}

Definition at line 84 of file StripClusteringTool.h.

84 {this, "StripDetElStatus", "",
85 "SiDetectorElementStatus for strip"};

◆ m_stripID

const StripID* ActsTrk::StripClusteringTool::m_stripID {nullptr}
private

Definition at line 107 of file StripClusteringTool.h.

107{nullptr};

◆ m_timeBinBits

int ActsTrk::StripClusteringTool::m_timeBinBits[3] {-1, -1, -1}
private

Definition at line 104 of file StripClusteringTool.h.

104{-1, -1, -1};

◆ m_timeBinStr

StringProperty ActsTrk::StripClusteringTool::m_timeBinStr {this, "timeBins", ""}
private

Definition at line 77 of file StripClusteringTool.h.

77{this, "timeBins", ""};

The documentation for this class was generated from the following files: